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  }