github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/internal/tables/locked_table.go (about) 1 package tables 2 3 import ( 4 "fmt" 5 "sync" 6 7 "github.com/hirochachacha/plua/object" 8 ) 9 10 type lockedTable struct { 11 t *table 12 m sync.Mutex 13 } 14 15 func NewLockedTableSize(asize, msize int) object.Table { 16 return &lockedTable{ 17 t: NewTableSize(asize, msize).(*table), 18 } 19 } 20 21 func (t *lockedTable) Type() object.Type { 22 return object.TTABLE 23 } 24 25 func (t *lockedTable) String() string { 26 return fmt.Sprintf("table: %p", t) 27 } 28 29 func (t *lockedTable) Len() int { 30 t.m.Lock() 31 32 length := t.t.Len() 33 34 t.m.Unlock() 35 36 return length 37 } 38 39 func (t *lockedTable) Get(key object.Value) object.Value { 40 t.m.Lock() 41 42 val := t.t.Get(key) 43 44 t.m.Unlock() 45 46 return val 47 } 48 49 func (t *lockedTable) Set(key, val object.Value) { 50 t.m.Lock() 51 52 t.t.Set(key, val) 53 54 t.m.Unlock() 55 } 56 57 func (t *lockedTable) Del(key object.Value) { 58 t.m.Lock() 59 60 t.t.Del(key) 61 62 t.m.Unlock() 63 } 64 65 func (t *lockedTable) Next(key object.Value) (nkey, nval object.Value, ok bool) { 66 t.m.Lock() 67 68 nkey, nval, ok = t.t.Next(key) 69 70 t.m.Unlock() 71 72 return 73 } 74 75 func (t *lockedTable) SetList(base int, src []object.Value) { 76 t.m.Lock() 77 78 t.t.SetList(base, src) 79 80 t.m.Unlock() 81 } 82 83 func (t *lockedTable) SetMetatable(mt object.Table) { 84 t.m.Lock() 85 86 t.t.SetMetatable(mt) 87 88 t.m.Unlock() 89 } 90 91 func (t *lockedTable) Metatable() object.Table { 92 t.m.Lock() 93 94 mt := t.t.Metatable() 95 96 t.m.Unlock() 97 98 return mt 99 }