From 3fe63db6fb6b8288631459284bc630d322709d67 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Fri, 24 Jul 2015 13:26:25 +1000 Subject: [PATCH] Pasted from package fuseshim. --- internal/buffer/buffer.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 internal/buffer/buffer.go diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go new file mode 100644 index 0000000..d2999bc --- /dev/null +++ b/internal/buffer/buffer.go @@ -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 +}