mirror of
https://github.com/ceph/go-ceph
synced 2024-12-24 15:13:11 +00:00
430dea5b7f
In order to be able to swich on and off PtrGuard usage, SyncBuffer implements a typical usage pattern of PtrGuard, that is a data buffer referenced from inside a C allocated struct, in two ways: 1) using a PtrGuard to dierctly store a pointer to the Go buffer in C memory, or 2) allocating a C buffer of same size and syncing data back with C.memcpy(). The implementation can be chosen with the with_ptrguard build tag. Signed-off-by: Sven Anderson <sven@redhat.com>
29 lines
595 B
Go
29 lines
595 B
Go
// +build ptrguard
|
|
|
|
package cutil
|
|
|
|
import (
|
|
"unsafe"
|
|
)
|
|
|
|
// SyncBuffer is a C buffer connected to a data slice
|
|
type SyncBuffer struct {
|
|
pg *PtrGuard
|
|
}
|
|
|
|
// NewSyncBuffer creates a C buffer from a data slice and stores it at CPtr
|
|
func NewSyncBuffer(cPtr CPtr, data []byte) *SyncBuffer {
|
|
var v SyncBuffer
|
|
v.pg = NewPtrGuard(cPtr, unsafe.Pointer(&data[0]))
|
|
return &v
|
|
}
|
|
|
|
// Release releases the C buffer and nulls its stored pointer
|
|
func (v *SyncBuffer) Release() {
|
|
v.pg.Release()
|
|
}
|
|
|
|
// Sync asserts that changes in the C buffer are available in the data
|
|
// slice
|
|
func (v *SyncBuffer) Sync() {}
|