handles, merge, odb: changes for Go 1.6 pointer passing rules
See http://tip.golang.org/cmd/cgo/#hdr-Passing_pointers .
This commit is contained in:
parent
4ee13db86d
commit
42b11d403d
|
@ -52,12 +52,12 @@ func (v *HandleList) Track(pointer interface{}) unsafe.Pointer {
|
||||||
|
|
||||||
v.Unlock()
|
v.Unlock()
|
||||||
|
|
||||||
return unsafe.Pointer(&slot)
|
return unsafe.Pointer(uintptr(slot))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Untrack stops tracking the pointer given by the handle
|
// Untrack stops tracking the pointer given by the handle
|
||||||
func (v *HandleList) Untrack(handle unsafe.Pointer) {
|
func (v *HandleList) Untrack(handle unsafe.Pointer) {
|
||||||
slot := *(*int)(handle)
|
slot := int(uintptr(handle))
|
||||||
|
|
||||||
v.Lock()
|
v.Lock()
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ func (v *HandleList) Untrack(handle unsafe.Pointer) {
|
||||||
|
|
||||||
// Get retrieves the pointer from the given handle
|
// Get retrieves the pointer from the given handle
|
||||||
func (v *HandleList) Get(handle unsafe.Pointer) interface{} {
|
func (v *HandleList) Get(handle unsafe.Pointer) interface{} {
|
||||||
slot := *(*int)(handle)
|
slot := int(uintptr(handle))
|
||||||
|
|
||||||
v.RLock()
|
v.RLock()
|
||||||
|
|
||||||
|
|
22
merge.go
22
merge.go
|
@ -321,17 +321,21 @@ type MergeFileInput struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// populate a C struct with merge file input, make sure to use freeMergeFileInput to clean up allocs
|
// populate a C struct with merge file input, make sure to use freeMergeFileInput to clean up allocs
|
||||||
func populateCMergeFileInput(c *C.git_merge_file_input, input MergeFileInput) {
|
func populateCMergeFileInput(c *C.git_merge_file_input, input MergeFileInput) *C.char {
|
||||||
c.path = C.CString(input.Path)
|
c.path = C.CString(input.Path)
|
||||||
|
var toFree *C.char
|
||||||
if input.Contents != nil {
|
if input.Contents != nil {
|
||||||
c.ptr = (*C.char)(unsafe.Pointer(&input.Contents[0]))
|
toFree = C.CString(string(input.Contents))
|
||||||
|
c.ptr = toFree
|
||||||
c.size = C.size_t(len(input.Contents))
|
c.size = C.size_t(len(input.Contents))
|
||||||
}
|
}
|
||||||
c.mode = C.uint(input.Mode)
|
c.mode = C.uint(input.Mode)
|
||||||
|
return toFree
|
||||||
}
|
}
|
||||||
|
|
||||||
func freeCMergeFileInput(c *C.git_merge_file_input) {
|
func freeCMergeFileInput(c *C.git_merge_file_input, toFree *C.char) {
|
||||||
C.free(unsafe.Pointer(c.path))
|
C.free(unsafe.Pointer(c.path))
|
||||||
|
C.free(unsafe.Pointer(toFree))
|
||||||
}
|
}
|
||||||
|
|
||||||
type MergeFileFlags int
|
type MergeFileFlags int
|
||||||
|
@ -382,12 +386,12 @@ func MergeFile(ancestor MergeFileInput, ours MergeFileInput, theirs MergeFileInp
|
||||||
var cours C.git_merge_file_input
|
var cours C.git_merge_file_input
|
||||||
var ctheirs C.git_merge_file_input
|
var ctheirs C.git_merge_file_input
|
||||||
|
|
||||||
populateCMergeFileInput(&cancestor, ancestor)
|
t := populateCMergeFileInput(&cancestor, ancestor)
|
||||||
defer freeCMergeFileInput(&cancestor)
|
defer freeCMergeFileInput(&cancestor, t)
|
||||||
populateCMergeFileInput(&cours, ours)
|
t = populateCMergeFileInput(&cours, ours)
|
||||||
defer freeCMergeFileInput(&cours)
|
defer freeCMergeFileInput(&cours, t)
|
||||||
populateCMergeFileInput(&ctheirs, theirs)
|
t = populateCMergeFileInput(&ctheirs, theirs)
|
||||||
defer freeCMergeFileInput(&ctheirs)
|
defer freeCMergeFileInput(&ctheirs, t)
|
||||||
|
|
||||||
var copts *C.git_merge_file_options
|
var copts *C.git_merge_file_options
|
||||||
if options != nil {
|
if options != nil {
|
||||||
|
|
5
odb.go
5
odb.go
|
@ -61,12 +61,13 @@ func (v *Odb) Exists(oid *Oid) bool {
|
||||||
|
|
||||||
func (v *Odb) Write(data []byte, otype ObjectType) (oid *Oid, err error) {
|
func (v *Odb) Write(data []byte, otype ObjectType) (oid *Oid, err error) {
|
||||||
oid = new(Oid)
|
oid = new(Oid)
|
||||||
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&data))
|
cstr := C.CString(string(data))
|
||||||
|
defer C.free(unsafe.Pointer(cstr))
|
||||||
|
|
||||||
runtime.LockOSThread()
|
runtime.LockOSThread()
|
||||||
defer runtime.UnlockOSThread()
|
defer runtime.UnlockOSThread()
|
||||||
|
|
||||||
ret := C.git_odb_write(oid.toC(), v.ptr, unsafe.Pointer(hdr.Data), C.size_t(hdr.Len), C.git_otype(otype))
|
ret := C.git_odb_write(oid.toC(), v.ptr, unsafe.Pointer(cstr), C.size_t(len(data)), C.git_otype(otype))
|
||||||
|
|
||||||
if ret < 0 {
|
if ret < 0 {
|
||||||
return nil, MakeGitError(ret)
|
return nil, MakeGitError(ret)
|
||||||
|
|
Loading…
Reference in New Issue