Fix memleak, TreeBuilder, Config and Parent commit #47

Merged
kron4eg merged 2 commits from tree_builder_mem_leak into master 2013-11-18 09:24:37 -06:00
3 changed files with 18 additions and 9 deletions

View File

@ -9,8 +9,8 @@ extern int _go_git_treewalk(git_tree *tree, git_treewalk_mode mode, void *ptr);
import "C" import "C"
import ( import (
"unsafe"
"time" "time"
"unsafe"
) )
// Commit // Commit
@ -48,12 +48,13 @@ func (c Commit) Committer() *Signature {
} }
func (c *Commit) Parent(n uint) *Commit { func (c *Commit) Parent(n uint) *Commit {
par := &Commit{} var cobj *C.git_object
ret := C.git_commit_parent(&par.ptr, c.ptr, C.uint(n)) ret := C.git_commit_parent(&cobj, c.ptr, C.uint(n))
if ret != 0 { if ret != 0 {
return nil return nil
} }
return par
return allocObject(cobj).(*Commit)
} }
func (c *Commit) ParentId(n uint) *Oid { func (c *Commit) ParentId(n uint) *Oid {
@ -85,10 +86,10 @@ func newSignatureFromC(sig *C.git_signature) *Signature {
// the offset in mintes, which is what git wants // the offset in mintes, which is what git wants
func (v *Signature) Offset() int { func (v *Signature) Offset() int {
_, offset := v.When.Zone() _, offset := v.When.Zone()
return offset/60 return offset / 60
} }
func (sig *Signature) toC() (*C.git_signature) { func (sig *Signature) toC() *C.git_signature {
var out *C.git_signature var out *C.git_signature
name := C.CString(sig.Name) name := C.CString(sig.Name)

View File

@ -6,6 +6,7 @@ package git
*/ */
import "C" import "C"
import ( import (
"runtime"
"unsafe" "unsafe"
) )
@ -66,3 +67,8 @@ func (c *Config) Set(name, value string) (err error) {
return nil return nil
} }
func (c *Config) Free() {
runtime.SetFinalizer(c, nil)
C.git_config_free(c.ptr)
}

View File

@ -6,8 +6,8 @@ package git
*/ */
import "C" import "C"
import ( import (
"unsafe"
"runtime" "runtime"
"unsafe"
) )
// Repository // Repository
@ -58,6 +58,7 @@ func (v *Repository) Config() (*Config, error) {
return nil, LastError() return nil, LastError()
} }
runtime.SetFinalizer(config, (*Config).Free)
return config, nil return config, nil
} }
@ -180,7 +181,7 @@ func (v *Repository) CreateCommit(
var cparents []*C.git_commit = nil var cparents []*C.git_commit = nil
var parentsarg **C.git_commit = nil var parentsarg **C.git_commit = nil
nparents:= len(parents) nparents := len(parents)
if nparents > 0 { if nparents > 0 {
cparents = make([]*C.git_commit, nparents) cparents = make([]*C.git_commit, nparents)
for i, v := range parents { for i, v := range parents {
@ -226,7 +227,7 @@ func (repo *Repository) Path() string {
return C.GoString(C.git_repository_path(repo.ptr)) return C.GoString(C.git_repository_path(repo.ptr))
} }
func (repo *Repository) IsBare() (bool) { func (repo *Repository) IsBare() bool {
return C.git_repository_is_bare(repo.ptr) != 0 return C.git_repository_is_bare(repo.ptr) != 0
} }
@ -249,6 +250,7 @@ func (v *Repository) TreeBuilder() (*TreeBuilder, error) {
if ret := C.git_treebuilder_create(&bld.ptr, nil); ret < 0 { if ret := C.git_treebuilder_create(&bld.ptr, nil); ret < 0 {
return nil, LastError() return nil, LastError()
} }
runtime.SetFinalizer(bld, (*TreeBuilder).Free)
bld.repo = v bld.repo = v
return bld, nil return bld, nil