Commit 9a8313a9 authored by Han-Wen Nienhuys's avatar Han-Wen Nienhuys

Deal with wrapping handles in portableHandleMap.

parent 22dcd8c5
...@@ -48,11 +48,23 @@ func (me *portableHandleMap) Register(obj *Handled, asInt interface{}) uint64 { ...@@ -48,11 +48,23 @@ func (me *portableHandleMap) Register(obj *Handled, asInt interface{}) uint64 {
} }
me.Lock() me.Lock()
defer me.Unlock() defer me.Unlock()
h := uint64(me.nextFree) for {
me.nextFree++ h := uint64(me.nextFree)
me.handles[h] = obj me.nextFree++
obj.check = 0xbaabbaab if h < 2 {
return h continue
}
old := me.handles[h]
if old != nil {
continue
}
me.handles[h] = obj
obj.check = 0xbaabbaab
return h
}
return 0
} }
func (me *portableHandleMap) Count() int { func (me *portableHandleMap) Count() int {
...@@ -125,7 +137,7 @@ func (me *int32HandleMap) Decode(handle uint64) *Handled { ...@@ -125,7 +137,7 @@ func (me *int32HandleMap) Decode(handle uint64) *Handled {
val := (*Handled)(unsafe.Pointer(uintptr(handle & ((1 << 32) - 1)))) val := (*Handled)(unsafe.Pointer(uintptr(handle & ((1 << 32) - 1))))
return val return val
} }
// 64 bits version of HandleMap // 64 bits version of HandleMap
type int64HandleMap struct { type int64HandleMap struct {
mutex sync.Mutex mutex sync.Mutex
...@@ -154,11 +166,10 @@ func (me *int64HandleMap) verify() { ...@@ -154,11 +166,10 @@ func (me *int64HandleMap) verify() {
func NewHandleMap(portable bool) (hm HandleMap) { func NewHandleMap(portable bool) (hm HandleMap) {
if portable { if portable {
return &portableHandleMap{ return &portableHandleMap{
nextFree: 2,
handles: make(map[uint64]*Handled), handles: make(map[uint64]*Handled),
} }
} }
var obj *Handled var obj *Handled
switch unsafe.Sizeof(obj) { switch unsafe.Sizeof(obj) {
case 8: case 8:
...@@ -238,7 +249,7 @@ func (me *int64HandleMap) Decode(handle uint64) (val *Handled) { ...@@ -238,7 +249,7 @@ func (me *int64HandleMap) Decode(handle uint64) (val *Handled) {
ptrBits := uintptr(handle & (1<<45 - 1)) ptrBits := uintptr(handle & (1<<45 - 1))
check := uint32(handle >> 45) check := uint32(handle >> 45)
val = (*Handled)(unsafe.Pointer(ptrBits<<3 + uintptr(baseAddress))) val = (*Handled)(unsafe.Pointer(ptrBits<<3 + uintptr(baseAddress)))
if val.check != check { if val.check != check {
msg := fmt.Sprintf("handle check mismatch; handle has 0x%x, object has 0x%x: %v", msg := fmt.Sprintf("handle check mismatch; handle has 0x%x, object has 0x%x: %v",
check, val.check, val.object) check, val.check, val.object)
...@@ -246,7 +257,7 @@ func (me *int64HandleMap) Decode(handle uint64) (val *Handled) { ...@@ -246,7 +257,7 @@ func (me *int64HandleMap) Decode(handle uint64) (val *Handled) {
} }
return val return val
} }
func init() { func init() {
// TODO - figure out a way to discover this nicely. This is // TODO - figure out a way to discover this nicely. This is
// depends in a pretty fragile way on the 6g allocator // depends in a pretty fragile way on the 6g allocator
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment