diff options
| author | Carlos Martín Nieto <[email protected]> | 2015-07-24 13:43:19 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <[email protected]> | 2015-07-24 13:43:19 +0200 |
| commit | d307391e08f681f4e9b38f9505ad2484f980e1b6 (patch) | |
| tree | 61589e52b00a58a7795b1704fff7e36b938fb2c8 /handles.go | |
| parent | 28dee704cafd347599ae55f30441275b219def03 (diff) | |
| parent | b5693c1429ad7247ce75b23ebb866f9428bde8b6 (diff) | |
Merge pull request #219 from shurcooL/next-fix-HandleList-Track-gc-issue
[next] Prevent slot int variable from being GCed.
Diffstat (limited to 'handles.go')
| -rw-r--r-- | handles.go | 11 |
1 files changed, 6 insertions, 5 deletions
@@ -10,14 +10,15 @@ type HandleList struct { sync.RWMutex // stores the Go pointers handles []interface{} - // indicates which indices are in use - set map[int]bool + // Indicates which indices are in use, and keeps a pointer to slot int variable (the handle) + // in the Go world, so that the Go garbage collector does not free it. + set map[int]*int } func NewHandleList() *HandleList { return &HandleList{ handles: make([]interface{}, 5), - set: make(map[int]bool), + set: make(map[int]*int), } } @@ -25,7 +26,7 @@ func NewHandleList() *HandleList { // list. You must only run this function while holding a write lock. func (v *HandleList) findUnusedSlot() int { for i := 1; i < len(v.handles); i++ { - isUsed := v.set[i] + _, isUsed := v.set[i] if !isUsed { return i } @@ -47,7 +48,7 @@ func (v *HandleList) Track(pointer interface{}) unsafe.Pointer { slot := v.findUnusedSlot() v.handles[slot] = pointer - v.set[slot] = true + v.set[slot] = &slot // Keep a pointer to slot in Go world, so it's not freed by GC. v.Unlock() |
