diff options
| author | Carlos MartÃn Nieto <[email protected]> | 2017-07-08 16:51:22 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-07-08 16:51:22 +0200 |
| commit | 08db2e2c167404c5ed9be0fc1c995e41bad479bb (patch) | |
| tree | 4a9c1357f3682d4134318e73ef85aa172cbfbd48 /submodule.go | |
| parent | 29c0b730076fe402c22ea3e3a11a7ed541663637 (diff) | |
| parent | 55a1096141519a1f380d0702671cfe9bf90ec435 (diff) | |
Merge pull request #393 from libgit2/cmn/keepalive-all-the-things
KeepAlive all the things
Diffstat (limited to 'submodule.go')
| -rw-r--r-- | submodule.go | 79 |
1 files changed, 56 insertions, 23 deletions
diff --git a/submodule.go b/submodule.go index 4a32ce4..406ed08 100644 --- a/submodule.go +++ b/submodule.go @@ -21,6 +21,18 @@ type SubmoduleUpdateOptions struct { // Submodule type Submodule struct { ptr *C.git_submodule + r *Repository +} + +func newSubmoduleFromC(ptr *C.git_submodule, r *Repository) *Submodule { + s := &Submodule{ptr: ptr, r: r} + runtime.SetFinalizer(s, (*Submodule).Free) + return s +} + +func (sub *Submodule) Free() { + runtime.SetFinalizer(sub, nil) + C.git_submodule_free(sub.ptr) } type SubmoduleUpdate int @@ -82,24 +94,24 @@ func (c *SubmoduleCollection) Lookup(name string) (*Submodule, error) { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) - sub := new(Submodule) + var ptr *C.git_submodule runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_submodule_lookup(&sub.ptr, c.repo.ptr, cname) + ret := C.git_submodule_lookup(&ptr, c.repo.ptr, cname) if ret < 0 { return nil, MakeGitError(ret) } - return sub, nil + return newSubmoduleFromC(ptr, c.repo), nil } type SubmoduleCbk func(sub *Submodule, name string) int //export SubmoduleVisitor func SubmoduleVisitor(csub unsafe.Pointer, name *C.char, handle unsafe.Pointer) C.int { - sub := &Submodule{(*C.git_submodule)(csub)} + sub := &Submodule{(*C.git_submodule)(csub), nil} if callback, ok := pointerHandles.Get(handle).(SubmoduleCbk); ok { return (C.int)(callback(sub, C.GoString(name))) @@ -116,6 +128,7 @@ func (c *SubmoduleCollection) Foreach(cbk SubmoduleCbk) error { defer pointerHandles.Untrack(handle) ret := C._go_git_visit_submodule(c.repo.ptr, handle) + runtime.KeepAlive(c) if ret < 0 { return MakeGitError(ret) } @@ -128,16 +141,15 @@ func (c *SubmoduleCollection) Add(url, path string, use_git_link bool) (*Submodu cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) - sub := new(Submodule) - runtime.LockOSThread() defer runtime.UnlockOSThread() - ret := C.git_submodule_add_setup(&sub.ptr, c.repo.ptr, curl, cpath, cbool(use_git_link)) + var ptr *C.git_submodule + ret := C.git_submodule_add_setup(&ptr, c.repo.ptr, curl, cpath, cbool(use_git_link)) if ret < 0 { return nil, MakeGitError(ret) } - return sub, nil + return newSubmoduleFromC(ptr, c.repo), nil } func (sub *Submodule) FinalizeAdd() error { @@ -145,6 +157,7 @@ func (sub *Submodule) FinalizeAdd() error { defer runtime.UnlockOSThread() ret := C.git_submodule_add_finalize(sub.ptr) + runtime.KeepAlive(sub) if ret < 0 { return MakeGitError(ret) } @@ -156,6 +169,7 @@ func (sub *Submodule) AddToIndex(write_index bool) error { defer runtime.UnlockOSThread() ret := C.git_submodule_add_to_index(sub.ptr, cbool(write_index)) + runtime.KeepAlive(sub) if ret < 0 { return MakeGitError(ret) } @@ -163,18 +177,21 @@ func (sub *Submodule) AddToIndex(write_index bool) error { } func (sub *Submodule) Name() string { - n := C.git_submodule_name(sub.ptr) - return C.GoString(n) + n := C.GoString(C.git_submodule_name(sub.ptr)) + runtime.KeepAlive(sub) + return n } func (sub *Submodule) Path() string { - n := C.git_submodule_path(sub.ptr) - return C.GoString(n) + n := C.GoString(C.git_submodule_path(sub.ptr)) + runtime.KeepAlive(sub) + return n } func (sub *Submodule) Url() string { - n := C.git_submodule_url(sub.ptr) - return C.GoString(n) + n := C.GoString(C.git_submodule_url(sub.ptr)) + runtime.KeepAlive(sub) + return n } func (c *SubmoduleCollection) SetUrl(submodule, url string) error { @@ -187,6 +204,7 @@ func (c *SubmoduleCollection) SetUrl(submodule, url string) error { defer runtime.UnlockOSThread() ret := C.git_submodule_set_url(c.repo.ptr, csubmodule, curl) + runtime.KeepAlive(c) if ret < 0 { return MakeGitError(ret) } @@ -194,31 +212,38 @@ func (c *SubmoduleCollection) SetUrl(submodule, url string) error { } func (sub *Submodule) IndexId() *Oid { + var id *Oid idx := C.git_submodule_index_id(sub.ptr) - if idx == nil { - return nil + if idx != nil { + id = newOidFromC(idx) } - return newOidFromC(idx) + runtime.KeepAlive(sub) + return id } func (sub *Submodule) HeadId() *Oid { + var id *Oid idx := C.git_submodule_head_id(sub.ptr) - if idx == nil { - return nil + if idx != nil { + id = newOidFromC(idx) } - return newOidFromC(idx) + runtime.KeepAlive(sub) + return id } func (sub *Submodule) WdId() *Oid { + var id *Oid idx := C.git_submodule_wd_id(sub.ptr) - if idx == nil { - return nil + if idx != nil { + id = newOidFromC(idx) } - return newOidFromC(idx) + runtime.KeepAlive(sub) + return id } func (sub *Submodule) Ignore() SubmoduleIgnore { o := C.git_submodule_ignore(sub.ptr) + runtime.KeepAlive(sub) return SubmoduleIgnore(o) } @@ -230,6 +255,7 @@ func (c *SubmoduleCollection) SetIgnore(submodule string, ignore SubmoduleIgnore defer runtime.UnlockOSThread() ret := C.git_submodule_set_ignore(c.repo.ptr, csubmodule, C.git_submodule_ignore_t(ignore)) + runtime.KeepAlive(c) if ret < 0 { return MakeGitError(ret) } @@ -239,6 +265,7 @@ func (c *SubmoduleCollection) SetIgnore(submodule string, ignore SubmoduleIgnore func (sub *Submodule) UpdateStrategy() SubmoduleUpdate { o := C.git_submodule_update_strategy(sub.ptr) + runtime.KeepAlive(sub) return SubmoduleUpdate(o) } @@ -250,6 +277,7 @@ func (c *SubmoduleCollection) SetUpdate(submodule string, update SubmoduleUpdate defer runtime.UnlockOSThread() ret := C.git_submodule_set_update(c.repo.ptr, csubmodule, C.git_submodule_update_t(update)) + runtime.KeepAlive(c) if ret < 0 { return MakeGitError(ret) } @@ -269,6 +297,7 @@ func (c *SubmoduleCollection) SetFetchRecurseSubmodules(submodule string, recurs defer runtime.UnlockOSThread() ret := C.git_submodule_set_fetch_recurse_submodules(c.repo.ptr, csubmodule, C.git_submodule_recurse_t(recurse)) + runtime.KeepAlive(c) if ret < 0 { return MakeGitError(C.int(ret)) } @@ -280,6 +309,7 @@ func (sub *Submodule) Init(overwrite bool) error { defer runtime.UnlockOSThread() ret := C.git_submodule_init(sub.ptr, cbool(overwrite)) + runtime.KeepAlive(sub) if ret < 0 { return MakeGitError(ret) } @@ -291,6 +321,7 @@ func (sub *Submodule) Sync() error { defer runtime.UnlockOSThread() ret := C.git_submodule_sync(sub.ptr) + runtime.KeepAlive(sub) if ret < 0 { return MakeGitError(ret) } @@ -303,6 +334,7 @@ func (sub *Submodule) Open() (*Repository, error) { var ptr *C.git_repository ret := C.git_submodule_open(&ptr, sub.ptr) + runtime.KeepAlive(sub) if ret < 0 { return nil, MakeGitError(ret) } @@ -320,6 +352,7 @@ func (sub *Submodule) Update(init bool, opts *SubmoduleUpdateOptions) error { defer runtime.UnlockOSThread() ret := C.git_submodule_update(sub.ptr, cbool(init), &copts) + runtime.KeepAlive(sub) if ret < 0 { return MakeGitError(ret) } |
