diff options
author | Ayke van Laethem <aykevanlaethem@gmail.com> | 2016-04-30 16:21:03 +0200 |
---|---|---|
committer | Ayke van Laethem <aykevanlaethem@gmail.com> | 2016-04-30 21:09:19 +0200 |
commit | 4ce8be3db5b6afe8e984367c2aad1f21bed9d47d (patch) | |
tree | f4f0f15615fb633ff7883ef594b22942f1f1b8ca /librsync/librsync.go | |
parent | 1014cf54546776c411483768cf90734addd4e1d5 (diff) | |
download | golibrsync-4ce8be3db5b6afe8e984367c2aad1f21bed9d47d.tar.gz golibrsync-4ce8be3db5b6afe8e984367c2aad1f21bed9d47d.tar.bz2 golibrsync-4ce8be3db5b6afe8e984367c2aad1f21bed9d47d.zip |
Do not use Go pointers containing Go pointers in a CGo call
https://github.com/golang/proposal/blob/master/design/12416-cgo-pointers.md
Diffstat (limited to 'librsync/librsync.go')
-rw-r--r-- | librsync/librsync.go | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/librsync/librsync.go b/librsync/librsync.go index 234b1f3..641e480 100644 --- a/librsync/librsync.go +++ b/librsync/librsync.go @@ -275,7 +275,7 @@ func NewDeltaGen(sig Signature, newfile io.Reader) (job *Job, err error) { // Patcher is a job with additional hidden data for patching. // -// IMPORTANT: You still need to Close() this! +// This patcher must be closed after use to free memory. type Patcher struct { *Job basis io.ReaderAt @@ -299,11 +299,21 @@ func NewPatcher(delta io.Reader, basis io.ReaderAt) (job *Patcher, err error) { Job: _job, basis: basis} - job.job = C.rs_patch_begin((*C.rs_copy_cb)(patchCallback), unsafe.Pointer(job)) + id := uintptr(unsafe.Pointer(_job.rsbufs)) // this is a unique, unchanging number (C doesn't change pointers under the hood) + storePatcher(job, id) + job.job = C.rs_patch_begin((*C.rs_copy_cb)(patchCallback), unsafe.Pointer(id)) if job.job == nil { + dropPatcher(id) job.Close() return nil, errors.New("rs_patch_begin failed") } return } + +// Close unreferences memory that the garbage collector would not otherwise be +// able to free. +func (patch *Patcher) Close() error { + dropPatcher(uintptr(unsafe.Pointer(patch.Job.rsbufs))) + return patch.Job.Close() +} |