57 lines
1.0 KiB
Go
57 lines
1.0 KiB
Go
package main
|
|
|
|
import "C"
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
)
|
|
|
|
type ObjectReference int64
|
|
|
|
var NullObjectReference error = errors.New("Null object reference")
|
|
|
|
// GoMemoryStore is a int->interface storage structure so that Go pointers are
|
|
// never exposed to C code.
|
|
type GoMemoryStore struct {
|
|
mtx sync.RWMutex
|
|
items map[int64]interface{}
|
|
next int64
|
|
}
|
|
|
|
func NewGoMemoryStore() *GoMemoryStore {
|
|
ret := GoMemoryStore{}
|
|
ret.items = make(map[int64]interface{})
|
|
return &ret
|
|
}
|
|
|
|
func (this *GoMemoryStore) Put(itm interface{}) ObjectReference {
|
|
this.mtx.Lock()
|
|
defer this.mtx.Unlock()
|
|
|
|
key := this.next
|
|
this.items[key] = itm
|
|
this.next++
|
|
return ObjectReference(key)
|
|
}
|
|
|
|
func (this *GoMemoryStore) Get(i ObjectReference) (interface{}, bool) {
|
|
this.mtx.RLock()
|
|
defer this.mtx.RUnlock()
|
|
|
|
ret, ok := this.items[int64(i)]
|
|
return ret, ok
|
|
}
|
|
|
|
func (this *GoMemoryStore) Delete(i ObjectReference) {
|
|
this.mtx.Lock()
|
|
defer this.mtx.Unlock()
|
|
|
|
delete(this.items, int64(i))
|
|
}
|
|
|
|
var gms *GoMemoryStore = nil
|
|
|
|
func init() {
|
|
gms = NewGoMemoryStore()
|
|
}
|