// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package seq //#cgo LDFLAGS: -llog //#include //#include //import "C" import ( "fmt" "sync" ) // refs stores Go objects that have been passed to another language. var refs struct { sync.Mutex next int32 // next reference number to use for Go object, always negative refs map[interface{}]int32 objs map[int32]interface{} } func init() { refs.Lock() refs.next = -24 // Go objects get negative reference numbers. Arbitrary starting point. refs.refs = make(map[interface{}]int32) refs.objs = make(map[int32]interface{}) refs.Unlock() } // A Ref represents a Java or Go object passed across the language // boundary. type Ref struct { Num int32 } // Get returns the underlying object. func (r *Ref) Get() interface{} { refs.Lock() obj, ok := refs.objs[r.Num] refs.Unlock() if !ok { panic(fmt.Sprintf("unknown ref %d", r.Num)) } return obj } // Delete remove the reference to the underlying object. func Delete(num int32) { refs.Lock() obj, ok := refs.objs[num] if !ok { panic(fmt.Sprintf("seq.Delete unknown refnum: %d", num)) } delete(refs.objs, num) delete(refs.refs, obj) refs.Unlock() }