summaryrefslogtreecommitdiff
path: root/tree.go
diff options
context:
space:
mode:
authorCarlos Martín Nieto <[email protected]>2013-09-18 09:23:47 +0200
committerCarlos Martín Nieto <[email protected]>2013-12-18 16:18:32 +0100
commita40bdfd4202db244bfc5da348a0f0c528ef122cd (patch)
tree115fcae49287c82eb55bb275cbbd4556fbed72b7 /tree.go
parent625ffd022e2c39f3820543cc1239deeb21837266 (diff)
Lock the OS thread when acessing errors
The library stores error information in thread-local storage, which means we need to make sure that the Go runtime doesn't switch OS threads between the time we call a function and th time we attempt to retrieve the error information.
Diffstat (limited to 'tree.go')
-rw-r--r--tree.go13
1 files changed, 13 insertions, 0 deletions
diff --git a/tree.go b/tree.go
index 3abd31c..8c74e5d 100644
--- a/tree.go
+++ b/tree.go
@@ -62,6 +62,9 @@ func (t Tree) EntryByPath(path string) (*TreeEntry, error) {
defer C.free(unsafe.Pointer(cpath))
var entry *C.git_tree_entry
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
ret := C.git_tree_entry_bypath(&entry, t.ptr, cpath)
if ret < 0 {
return nil, LastError()
@@ -96,6 +99,9 @@ func CallbackGitTreeWalk(_root unsafe.Pointer, _entry unsafe.Pointer, ptr unsafe
}
func (t Tree) Walk(callback TreeWalkCallback) error {
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
err := C._go_git_treewalk(
t.ptr,
C.GIT_TREEWALK_PRE,
@@ -123,6 +129,9 @@ func (v *TreeBuilder) Insert(filename string, id *Oid, filemode int) (error) {
cfilename := C.CString(filename)
defer C.free(unsafe.Pointer(cfilename))
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
err := C.git_treebuilder_insert(nil, v.ptr, cfilename, id.toC(), C.git_filemode_t(filemode))
if err < 0 {
return LastError()
@@ -133,6 +142,10 @@ func (v *TreeBuilder) Insert(filename string, id *Oid, filemode int) (error) {
func (v *TreeBuilder) Write() (*Oid, error) {
oid := new(Oid)
+
+ runtime.LockOSThread()
+ defer runtime.UnlockOSThread()
+
err := C.git_treebuilder_write(oid.toC(), v.repo.ptr, v.ptr)
if err < 0 {