summaryrefslogtreecommitdiff
path: root/blob.go
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2015-05-30 22:23:23 +0200
committerCarlos Martín Nieto <[email protected]>2015-05-30 22:23:23 +0200
commit35ff0de8559ed987ff82b025cc2bb5983f29e559 (patch)
tree62b2ffe5ef7c32f89a49bb722c1cce85b2a9656b /blob.go
parent193deb7ae3cbc5d5a1f7f186aae6edb20bff950a (diff)
parente8531dd5c31fc87044e9061b18f37df9b05bd0ac (diff)
Merge pull request #196 from pks-t/pointer-indirection
[WIP/RFC] Pointer indirection
Diffstat (limited to 'blob.go')
-rw-r--r--blob.go15
1 files changed, 12 insertions, 3 deletions
diff --git a/blob.go b/blob.go
index 5a33bd8..b1fc78a 100644
--- a/blob.go
+++ b/blob.go
@@ -60,8 +60,13 @@ type BlobCallbackData struct {
}
//export blobChunkCb
-func blobChunkCb(buffer *C.char, maxLen C.size_t, payload unsafe.Pointer) int {
- data := (*BlobCallbackData)(payload)
+func blobChunkCb(buffer *C.char, maxLen C.size_t, handle unsafe.Pointer) int {
+ payload := pointerHandles.Get(handle)
+ data, ok := payload.(*BlobCallbackData)
+ if !ok {
+ panic("could not retrieve blob callback data")
+ }
+
goBuf, err := data.Callback(int(maxLen))
if err == io.EOF {
return 0
@@ -83,8 +88,12 @@ func (repo *Repository) CreateBlobFromChunks(hintPath string, callback BlobChunk
defer C.free(unsafe.Pointer(chintPath))
}
oid := C.git_oid{}
+
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 {
return nil, payload.Error
}