Pasted from package fuseshim.
parent
27eba3068c
commit
3fe63db6fb
|
@ -0,0 +1,39 @@
|
||||||
|
package fuseshim
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/jacobsa/fuse/internal/fusekernel"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Buffer provides a mechanism for constructing a message from multiple
|
||||||
|
// segments.
|
||||||
|
type Buffer []byte
|
||||||
|
|
||||||
|
// alloc allocates size bytes and returns a pointer to the new
|
||||||
|
// segment.
|
||||||
|
func (w *Buffer) Alloc(size uintptr) unsafe.Pointer {
|
||||||
|
s := int(size)
|
||||||
|
if len(*w)+s > cap(*w) {
|
||||||
|
old := *w
|
||||||
|
*w = make([]byte, len(*w), 2*cap(*w)+s)
|
||||||
|
copy(*w, old)
|
||||||
|
}
|
||||||
|
l := len(*w)
|
||||||
|
*w = (*w)[:l+s]
|
||||||
|
return unsafe.Pointer(&(*w)[l])
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset clears out the contents of the buffer.
|
||||||
|
func (w *Buffer) reset() {
|
||||||
|
for i := range (*w)[:cap(*w)] {
|
||||||
|
(*w)[i] = 0
|
||||||
|
}
|
||||||
|
*w = (*w)[:0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBuffer(extra uintptr) (buf Buffer) {
|
||||||
|
const hdrSize = unsafe.Sizeof(fusekernel.OutHeader{})
|
||||||
|
buf = make(Buffer, hdrSize, hdrSize+extra)
|
||||||
|
return
|
||||||
|
}
|
Loading…
Reference in New Issue