tree: use HandleList for C function callbacks.
This commit is contained in:
parent
bde012f3d4
commit
be3a626f2e
10
tree.go
10
tree.go
|
@ -93,19 +93,25 @@ type TreeWalkCallback func(string, *TreeEntry) int
|
||||||
func CallbackGitTreeWalk(_root unsafe.Pointer, _entry unsafe.Pointer, ptr unsafe.Pointer) C.int {
|
func CallbackGitTreeWalk(_root unsafe.Pointer, _entry unsafe.Pointer, ptr unsafe.Pointer) C.int {
|
||||||
root := C.GoString((*C.char)(_root))
|
root := C.GoString((*C.char)(_root))
|
||||||
entry := (*C.git_tree_entry)(_entry)
|
entry := (*C.git_tree_entry)(_entry)
|
||||||
callback := *(*TreeWalkCallback)(ptr)
|
|
||||||
|
|
||||||
|
if callback, ok := pointerHandles.Get(ptr).(TreeWalkCallback); ok {
|
||||||
return C.int(callback(root, newTreeEntry(entry)))
|
return C.int(callback(root, newTreeEntry(entry)))
|
||||||
|
} else {
|
||||||
|
return C.int(-1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Tree) Walk(callback TreeWalkCallback) error {
|
func (t Tree) Walk(callback TreeWalkCallback) error {
|
||||||
runtime.LockOSThread()
|
runtime.LockOSThread()
|
||||||
defer runtime.UnlockOSThread()
|
defer runtime.UnlockOSThread()
|
||||||
|
|
||||||
|
ptr := pointerHandles.Track(callback)
|
||||||
|
defer pointerHandles.Untrack(ptr)
|
||||||
|
|
||||||
err := C._go_git_treewalk(
|
err := C._go_git_treewalk(
|
||||||
t.cast_ptr,
|
t.cast_ptr,
|
||||||
C.GIT_TREEWALK_PRE,
|
C.GIT_TREEWALK_PRE,
|
||||||
unsafe.Pointer(&callback),
|
ptr,
|
||||||
)
|
)
|
||||||
|
|
||||||
if err < 0 {
|
if err < 0 {
|
||||||
|
|
Loading…
Reference in New Issue