blob: use HandleList for C function callbacks.

This commit is contained in:
Patrick Steinhardt 2015-04-24 10:13:52 +02:00
parent fe902f56a8
commit 83f9e6a705
1 changed files with 12 additions and 3 deletions

15
blob.go
View File

@ -60,8 +60,13 @@ type BlobCallbackData struct {
} }
//export blobChunkCb //export blobChunkCb
func blobChunkCb(buffer *C.char, maxLen C.size_t, payload unsafe.Pointer) int { func blobChunkCb(buffer *C.char, maxLen C.size_t, handle unsafe.Pointer) int {
data := (*BlobCallbackData)(payload) payload := pointerHandles.Get(handle)
data, ok := payload.(*BlobCallbackData)
if !ok {
panic("could not retrieve blob callback data")
}
goBuf, err := data.Callback(int(maxLen)) goBuf, err := data.Callback(int(maxLen))
if err == io.EOF { if err == io.EOF {
return 0 return 0
@ -83,8 +88,12 @@ func (repo *Repository) CreateBlobFromChunks(hintPath string, callback BlobChunk
defer C.free(unsafe.Pointer(chintPath)) defer C.free(unsafe.Pointer(chintPath))
} }
oid := C.git_oid{} oid := C.git_oid{}
payload := &BlobCallbackData{Callback: callback} payload := &BlobCallbackData{Callback: callback}
ecode := C._go_git_blob_create_fromchunks(&oid, repo.ptr, chintPath, unsafe.Pointer(payload)) handle := pointerHandles.Track(payload)
defer pointerHandles.Untrack(handle)
ecode := C._go_git_blob_create_fromchunks(&oid, repo.ptr, chintPath, handle)
if payload.Error != nil { if payload.Error != nil {
return nil, payload.Error return nil, payload.Error
} }