diff options
| author | Patrick Steinhardt <[email protected]> | 2015-04-24 10:16:12 +0200 |
|---|---|---|
| committer | Patrick Steinhardt <[email protected]> | 2015-05-22 09:02:24 +0200 |
| commit | a843b7247f24a2125c30c865f9d8ea706ce3d768 (patch) | |
| tree | 9a4d67b8ed3614896be2723619112c0b036e4e53 | |
| parent | 83f9e6a7053cae61cf835221b3a61bdeb2e528f4 (diff) | |
packbuilder: use HandleList for C function callbacks.
| -rw-r--r-- | packbuilder.go | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/packbuilder.go b/packbuilder.go index 54a8390..4dc352c 100644 --- a/packbuilder.go +++ b/packbuilder.go @@ -110,8 +110,13 @@ type packbuilderCbData struct { } //export packbuilderForEachCb -func packbuilderForEachCb(buf unsafe.Pointer, size C.size_t, payload unsafe.Pointer) int { - data := (*packbuilderCbData)(payload) +func packbuilderForEachCb(buf unsafe.Pointer, size C.size_t, handle unsafe.Pointer) int { + payload := pointerHandles.Get(handle) + data, ok := payload.(*packbuilderCbData) + if !ok { + panic("could not get packbuilder CB data") + } + slice := C.GoBytes(buf, C.int(size)) err := data.callback(slice) @@ -130,11 +135,13 @@ func (pb *Packbuilder) ForEach(callback PackbuilderForeachCallback) error { callback: callback, err: nil, } + handle := pointerHandles.Track(&data) + defer pointerHandles.Untrack(handle) runtime.LockOSThread() defer runtime.UnlockOSThread() - err := C._go_git_packbuilder_foreach(pb.ptr, unsafe.Pointer(&data)) + err := C._go_git_packbuilder_foreach(pb.ptr, handle) if err == C.GIT_EUSER { return data.err } |
