index: use HandleList for C function callbacks.

This commit is contained in:
Patrick Steinhardt 2015-04-24 09:40:49 +02:00
parent 0a336e4abd
commit 9bbec34885
1 changed files with 19 additions and 11 deletions

View File

@ -162,16 +162,17 @@ func (v *Index) AddAll(pathspecs []string, flags IndexAddOpts, callback IndexMat
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() defer runtime.UnlockOSThread()
var cb *IndexMatchedPathCallback var handle unsafe.Pointer
if callback != nil { if callback != nil {
cb = &callback handle = pointerHandles.Track(callback)
defer pointerHandles.Untrack(handle)
} }
ret := C._go_git_index_add_all( ret := C._go_git_index_add_all(
v.ptr, v.ptr,
&cpathspecs, &cpathspecs,
C.uint(flags), C.uint(flags),
unsafe.Pointer(cb), handle,
) )
if ret < 0 { if ret < 0 {
return MakeGitError(ret) return MakeGitError(ret)
@ -188,15 +189,16 @@ func (v *Index) UpdateAll(pathspecs []string, callback IndexMatchedPathCallback)
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() defer runtime.UnlockOSThread()
var cb *IndexMatchedPathCallback var handle unsafe.Pointer
if callback != nil { if callback != nil {
cb = &callback handle = pointerHandles.Track(callback)
defer pointerHandles.Untrack(handle)
} }
ret := C._go_git_index_update_all( ret := C._go_git_index_update_all(
v.ptr, v.ptr,
&cpathspecs, &cpathspecs,
unsafe.Pointer(cb), handle,
) )
if ret < 0 { if ret < 0 {
return MakeGitError(ret) return MakeGitError(ret)
@ -213,15 +215,16 @@ func (v *Index) RemoveAll(pathspecs []string, callback IndexMatchedPathCallback)
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() defer runtime.UnlockOSThread()
var cb *IndexMatchedPathCallback var handle unsafe.Pointer
if callback != nil { if callback != nil {
cb = &callback handle = pointerHandles.Track(callback)
defer pointerHandles.Untrack(handle)
} }
ret := C._go_git_index_remove_all( ret := C._go_git_index_remove_all(
v.ptr, v.ptr,
&cpathspecs, &cpathspecs,
unsafe.Pointer(cb), handle,
) )
if ret < 0 { if ret < 0 {
return MakeGitError(ret) return MakeGitError(ret)
@ -231,8 +234,13 @@ func (v *Index) RemoveAll(pathspecs []string, callback IndexMatchedPathCallback)
//export indexMatchedPathCallback //export indexMatchedPathCallback
func indexMatchedPathCallback(cPath, cMatchedPathspec *C.char, payload unsafe.Pointer) int { func indexMatchedPathCallback(cPath, cMatchedPathspec *C.char, payload unsafe.Pointer) int {
callback := (*IndexMatchedPathCallback)(payload) if payload == nil {
return (*callback)(C.GoString(cPath), C.GoString(cMatchedPathspec)) return 0
} else if callback, ok := pointerHandles.Get(payload).(IndexMatchedPathCallback); ok {
return callback(C.GoString(cPath), C.GoString(cMatchedPathspec))
} else {
return -1
}
} }
func (v *Index) RemoveByPath(path string) error { func (v *Index) RemoveByPath(path string) error {