add OdbBackend.Free() and the C it wraps; go fmt odb.go

This commit is contained in:
Aidan Nulman 2014-01-29 18:55:17 -05:00
parent d59f6d6d90
commit 1c23e8ece3
2 changed files with 34 additions and 20 deletions

45
odb.go
View File

@ -5,12 +5,13 @@ package git
#include <git2/errors.h> #include <git2/errors.h>
extern int _go_git_odb_foreach(git_odb *db, void *payload); extern int _go_git_odb_foreach(git_odb *db, void *payload);
extern void _go_git_odb_backend_free(git_odb_backend *backend);
*/ */
import "C" import "C"
import ( import (
"unsafe"
"reflect" "reflect"
"runtime" "runtime"
"unsafe"
) )
type Odb struct { type Odb struct {
@ -18,33 +19,33 @@ type Odb struct {
} }
type OdbBackend struct { type OdbBackend struct {
ptr *C.git_odb_backend ptr *C.git_odb_backend
} }
func NewOdb() (odb *Odb, err error) { func NewOdb() (odb *Odb, err error) {
odb = new(Odb) odb = new(Odb)
ret := C.git_odb_new(&odb.ptr) ret := C.git_odb_new(&odb.ptr)
if ret < 0 { if ret < 0 {
return nil, LastError() return nil, LastError()
} }
runtime.SetFinalizer(odb, (*Odb).Free) runtime.SetFinalizer(odb, (*Odb).Free)
return return
} }
func NewOdbBackendFromC(ptr *C.git_odb_backend) (backend *OdbBackend) { func NewOdbBackendFromC(ptr *C.git_odb_backend) (backend *OdbBackend) {
backend = &OdbBackend{ptr} backend = &OdbBackend{ptr}
return return
} }
func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) { func (v *Odb) AddBackend(backend *OdbBackend, priority int) (err error) {
ret := C.git_odb_add_backend(v.ptr, backend.ptr, C.int(priority)) ret := C.git_odb_add_backend(v.ptr, backend.ptr, C.int(priority))
if ret < 0 { if ret < 0 {
err = LastError() backend.Free()
} err = LastError()
return nil }
return nil
} }
func (v *Odb) Exists(oid *Oid) bool { func (v *Odb) Exists(oid *Oid) bool {
@ -93,9 +94,9 @@ func odbForEachCb(id *C.git_oid, payload unsafe.Pointer) int {
select { select {
case ch <- oid: case ch <- oid:
case <-ch: case <-ch:
return -1 return -1
} }
return 0; return 0
} }
func (v *Odb) forEachWrap(ch chan *Oid) { func (v *Odb) forEachWrap(ch chan *Oid) {
@ -136,6 +137,10 @@ func (v *Odb) NewWriteStream(size int, otype ObjectType) (*OdbWriteStream, error
return stream, nil return stream, nil
} }
func (v *OdbBackend) Free() {
C._go_git_odb_backend_free(v.ptr)
}
type OdbObject struct { type OdbObject struct {
ptr *C.git_odb_object ptr *C.git_odb_object
} }
@ -199,7 +204,7 @@ func (stream *OdbReadStream) Free() {
type OdbWriteStream struct { type OdbWriteStream struct {
ptr *C.git_odb_stream ptr *C.git_odb_stream
Id Oid Id Oid
} }
// Write writes to the stream // Write writes to the stream

View File

@ -1,5 +1,6 @@
#include "_cgo_export.h" #include "_cgo_export.h"
#include "git2.h" #include "git2.h"
#include "git2/sys/odb_backend.h"
#include "git2/submodule.h" #include "git2/submodule.h"
#include "git2/pack.h" #include "git2/pack.h"
@ -24,4 +25,12 @@ int _go_git_odb_foreach(git_odb *db, void *payload)
{ {
return git_odb_foreach(db, (git_odb_foreach_cb)&odbForEachCb, payload); return git_odb_foreach(db, (git_odb_foreach_cb)&odbForEachCb, payload);
} }
void _go_git_odb_backend_free(git_odb_backend *backend)
{
if (backend->free)
backend->free(backend);
return;
}
/* EOF */ /* EOF */