Skip to content

Commit

Permalink
Second round of keep-alives
Browse files Browse the repository at this point in the history
  • Loading branch information
carlosmn committed Jul 8, 2017
1 parent 58334cf commit 7d29d68
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 32 deletions.
57 changes: 42 additions & 15 deletions diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,31 +127,37 @@ func diffLineFromC(line *C.git_diff_line) DiffLine {
}

type Diff struct {
ptr *C.git_diff
ptr *C.git_diff
repo *Repository
}

func (diff *Diff) NumDeltas() (int, error) {
if diff.ptr == nil {
return -1, ErrInvalid
}
return int(C.git_diff_num_deltas(diff.ptr)), nil
ret := int(C.git_diff_num_deltas(diff.ptr))
runtime.KeepAlive(diff)
return ret, nil
}

func (diff *Diff) GetDelta(index int) (DiffDelta, error) {
if diff.ptr == nil {
return DiffDelta{}, ErrInvalid
}
ptr := C.git_diff_get_delta(diff.ptr, C.size_t(index))
return diffDeltaFromC(ptr), nil
ret := diffDeltaFromC(ptr)
runtime.KeepAlive(diff)
return ret, nil
}

func newDiffFromC(ptr *C.git_diff) *Diff {
func newDiffFromC(ptr *C.git_diff, repo *Repository) *Diff {
if ptr == nil {
return nil
}

diff := &Diff{
ptr: ptr,
ptr: ptr,
repo: repo,
}

runtime.SetFinalizer(diff, (*Diff).Free)
Expand Down Expand Up @@ -187,6 +193,7 @@ func (diff *Diff) FindSimilar(opts *DiffFindOptions) error {
defer runtime.UnlockOSThread()

ecode := C.git_diff_find_similar(diff.ptr, copts)
runtime.KeepAlive(diff)
if ecode < 0 {
return MakeGitError(ecode)
}
Expand All @@ -209,15 +216,21 @@ func (stats *DiffStats) Free() error {
}

func (stats *DiffStats) Insertions() int {
return int(C.git_diff_stats_insertions(stats.ptr))
ret := int(C.git_diff_stats_insertions(stats.ptr))
runtime.KeepAlive(stats)
return ret
}

func (stats *DiffStats) Deletions() int {
return int(C.git_diff_stats_deletions(stats.ptr))
ret := int(C.git_diff_stats_deletions(stats.ptr))
runtime.KeepAlive(stats)
return ret
}

func (stats *DiffStats) FilesChanged() int {
return int(C.git_diff_stats_files_changed(stats.ptr))
ret := int(C.git_diff_stats_files_changed(stats.ptr))
runtime.KeepAlive(stats)
return ret
}

type DiffStatsFormat int
Expand All @@ -240,6 +253,7 @@ func (stats *DiffStats) String(format DiffStatsFormat,

ret := C.git_diff_stats_to_buf(&buf,
stats.ptr, C.git_diff_stats_format_t(format), C.size_t(width))
runtime.KeepAlive(stats)
if ret < 0 {
return "", MakeGitError(ret)
}
Expand All @@ -253,7 +267,9 @@ func (diff *Diff) Stats() (*DiffStats, error) {
runtime.LockOSThread()
defer runtime.UnlockOSThread()

if ecode := C.git_diff_get_stats(&stats.ptr, diff.ptr); ecode < 0 {
ecode := C.git_diff_get_stats(&stats.ptr, diff.ptr)
runtime.KeepAlive(diff)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
runtime.SetFinalizer(stats, (*DiffStats).Free)
Expand Down Expand Up @@ -301,6 +317,7 @@ func (diff *Diff) ForEach(cbFile DiffForEachFileCallback, detail DiffDetail) err
defer pointerHandles.Untrack(handle)

ecode := C._go_git_diff_foreach(diff.ptr, 1, intHunks, intLines, handle)
runtime.KeepAlive(diff)
if ecode < 0 {
return data.Error
}
Expand Down Expand Up @@ -380,6 +397,7 @@ func (diff *Diff) Patch(deltaIndex int) (*Patch, error) {
defer runtime.UnlockOSThread()

ecode := C.git_patch_from_diff(&patchPtr, diff.ptr, C.size_t(deltaIndex))
runtime.KeepAlive(diff)
if ecode < 0 {
return nil, MakeGitError(ecode)
}
Expand Down Expand Up @@ -537,7 +555,7 @@ func diffNotifyCb(_diff_so_far unsafe.Pointer, delta_to_add *C.git_diff_delta, m

if data != nil {
if data.Diff == nil {
data.Diff = newDiffFromC(diff_so_far)
data.Diff = newDiffFromC(diff_so_far, nil)
}

err := data.Callback(data.Diff, diffDeltaFromC(delta_to_add), C.GoString(matched_pathspec))
Expand Down Expand Up @@ -618,14 +636,16 @@ func (v *Repository) DiffTreeToTree(oldTree, newTree *Tree, opts *DiffOptions) (
defer runtime.UnlockOSThread()

ecode := C.git_diff_tree_to_tree(&diffPtr, v.ptr, oldPtr, newPtr, copts)
runtime.KeepAlive(oldTree)
runtime.KeepAlive(newTree)
if ecode < 0 {
return nil, MakeGitError(ecode)
}

if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
return newDiffFromC(diffPtr), nil
return newDiffFromC(diffPtr, v), nil
}

func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff, error) {
Expand All @@ -643,14 +663,15 @@ func (v *Repository) DiffTreeToWorkdir(oldTree *Tree, opts *DiffOptions) (*Diff,
defer runtime.UnlockOSThread()

ecode := C.git_diff_tree_to_workdir(&diffPtr, v.ptr, oldPtr, copts)
runtime.KeepAlive(oldTree)
if ecode < 0 {
return nil, MakeGitError(ecode)
}

if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
return newDiffFromC(diffPtr), nil
return newDiffFromC(diffPtr, v), nil
}

func (v *Repository) DiffTreeToIndex(oldTree *Tree, index *Index, opts *DiffOptions) (*Diff, error) {
Expand All @@ -673,14 +694,16 @@ func (v *Repository) DiffTreeToIndex(oldTree *Tree, index *Index, opts *DiffOpti
defer runtime.UnlockOSThread()

ecode := C.git_diff_tree_to_index(&diffPtr, v.ptr, oldPtr, indexPtr, copts)
runtime.KeepAlive(oldTree)
runtime.KeepAlive(index)
if ecode < 0 {
return nil, MakeGitError(ecode)
}

if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
return newDiffFromC(diffPtr), nil
return newDiffFromC(diffPtr, v), nil
}

func (v *Repository) DiffTreeToWorkdirWithIndex(oldTree *Tree, opts *DiffOptions) (*Diff, error) {
Expand All @@ -698,14 +721,15 @@ func (v *Repository) DiffTreeToWorkdirWithIndex(oldTree *Tree, opts *DiffOptions
defer runtime.UnlockOSThread()

ecode := C.git_diff_tree_to_workdir_with_index(&diffPtr, v.ptr, oldPtr, copts)
runtime.KeepAlive(oldTree)
if ecode < 0 {
return nil, MakeGitError(ecode)
}

if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
return newDiffFromC(diffPtr), nil
return newDiffFromC(diffPtr, v), nil
}

func (v *Repository) DiffIndexToWorkdir(index *Index, opts *DiffOptions) (*Diff, error) {
Expand All @@ -723,14 +747,15 @@ func (v *Repository) DiffIndexToWorkdir(index *Index, opts *DiffOptions) (*Diff,
defer runtime.UnlockOSThread()

ecode := C.git_diff_index_to_workdir(&diffPtr, v.ptr, indexPtr, copts)
runtime.KeepAlive(index)
if ecode < 0 {
return nil, MakeGitError(ecode)
}

if notifyData != nil && notifyData.Diff != nil {
return notifyData.Diff, nil
}
return newDiffFromC(diffPtr), nil
return newDiffFromC(diffPtr, v), nil
}

// DiffBlobs performs a diff between two arbitrary blobs. You can pass
Expand Down Expand Up @@ -773,6 +798,8 @@ func DiffBlobs(oldBlob *Blob, oldAsPath string, newBlob *Blob, newAsPath string,
defer runtime.UnlockOSThread()

ecode := C._go_git_diff_blobs(oldBlobPtr, oldBlobPath, newBlobPtr, newBlobPath, copts, 1, intHunks, intLines, handle)
runtime.KeepAlive(oldBlob)
runtime.KeepAlive(newBlob)
if ecode < 0 {
return MakeGitError(ecode)
}
Expand Down
1 change: 1 addition & 0 deletions git.go
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ func ShortenOids(ids []*Oid, minlen int) (int, error) {
return int(ret), MakeGitError(ret)
}
}
runtime.KeepAlive(ids)
return int(ret), nil
}

Expand Down
6 changes: 6 additions & 0 deletions graph.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ func (repo *Repository) DescendantOf(commit, ancestor *Oid) (bool, error) {
defer runtime.UnlockOSThread()

ret := C.git_graph_descendant_of(repo.ptr, commit.toC(), ancestor.toC())
runtime.KeepAlive(repo)
runtime.KeepAlive(commit)
runtime.KeepAlive(ancestor)
if ret < 0 {
return false, MakeGitError(ret)
}
Expand All @@ -28,6 +31,9 @@ func (repo *Repository) AheadBehind(local, upstream *Oid) (ahead, behind int, er
var behindT C.size_t

ret := C.git_graph_ahead_behind(&aheadT, &behindT, repo.ptr, local.toC(), upstream.toC())
runtime.KeepAlive(repo)
runtime.KeepAlive(local)
runtime.KeepAlive(upstream)
if ret < 0 {
return 0, 0, MakeGitError(ret)
}
Expand Down
3 changes: 3 additions & 0 deletions ignore.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ func (v *Repository) AddIgnoreRule(rules string) error {
defer runtime.UnlockOSThread()

ret := C.git_ignore_add_rule(v.ptr, crules)
runtime.KeepAlive(v)
if ret < 0 {
return MakeGitError(ret)
}
Expand All @@ -28,6 +29,7 @@ func (v *Repository) ClearInternalIgnoreRules() error {
defer runtime.UnlockOSThread()

ret := C.git_ignore_clear_internal_rules(v.ptr)
runtime.KeepAlive(v)
if ret < 0 {
return MakeGitError(ret)
}
Expand All @@ -44,6 +46,7 @@ func (v *Repository) IsPathIgnored(path string) (bool, error) {
defer runtime.UnlockOSThread()

ret := C.git_ignore_path_is_ignored(&ignored, v.ptr, cpath)
runtime.KeepAlive(v)
if ret < 0 {
return false, MakeGitError(ret)
}
Expand Down
Loading

0 comments on commit 7d29d68

Please sign in to comment.