diff options
Diffstat (limited to 'odb.go')
| -rw-r--r-- | odb.go | 21 |
1 files changed, 14 insertions, 7 deletions
@@ -94,12 +94,16 @@ type OdbForEachCallback func(id *Oid) error type foreachData struct { callback OdbForEachCallback - err error + err error } //export odbForEachCb -func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int { - data := (*foreachData)(payload) +func odbForEachCb(id *C.git_oid, handle unsafe.Pointer) int { + data, ok := pointerHandles.Get(handle).(*foreachData) + + if !ok { + panic("could not retrieve handle") + } err := data.callback(newOidFromC(id)) if err != nil { @@ -111,15 +115,18 @@ func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int { } func (v *Odb) ForEach(callback OdbForEachCallback) error { - data := foreachData { + data := foreachData{ callback: callback, - err: nil, + err: nil, } runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C._go_git_odb_foreach(v.ptr, unsafe.Pointer(&data)) + handle := pointerHandles.Track(&data) + defer pointerHandles.Untrack(handle) + + ret := C._go_git_odb_foreach(v.ptr, handle) if ret == C.GIT_EUSER { return data.err } else if ret < 0 { @@ -138,7 +145,7 @@ func (v *Odb) Hash(data []byte, otype ObjectType) (oid *Oid, err error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_odb_hash(oid.toC(), ptr, C.size_t(header.Len), C.git_otype(otype)); + ret := C.git_odb_hash(oid.toC(), ptr, C.size_t(header.Len), C.git_otype(otype)) if ret < 0 { return nil, MakeGitError(ret) } |
