Index: third_party/mojo/src/mojo/public/go/system/shared_buffer.go |
diff --git a/third_party/mojo/src/mojo/public/go/system/shared_buffer.go b/third_party/mojo/src/mojo/public/go/system/shared_buffer.go |
index 927c7ea3d6433a2ba3a79e2520437822d196fe63..925ee353d637658d9ea48594509e2780ed7a6451 100644 |
--- a/third_party/mojo/src/mojo/public/go/system/shared_buffer.go |
+++ b/third_party/mojo/src/mojo/public/go/system/shared_buffer.go |
@@ -4,10 +4,10 @@ |
package system |
-//#include "c_allocators.h" |
-//#include "mojo/public/c/system/core.h" |
-import "C" |
-import "unsafe" |
+import ( |
+ "reflect" |
+ "unsafe" |
+) |
// SharedBufferHandle is a handle for a buffer that can be shared between |
// applications. |
@@ -27,35 +27,49 @@ type SharedBufferHandle interface { |
} |
type sharedBuffer struct { |
+ // baseHandle should always be the first component of this struct, |
+ // see |finalizeHandle()| for more details. |
baseHandle |
} |
func (h *sharedBuffer) DuplicateBufferHandle(opts *DuplicateBufferHandleOptions) (MojoResult, SharedBufferHandle) { |
+ var flags uint32 |
+ if opts != nil { |
+ flags = uint32(opts.flags) |
+ } |
h.core.mu.Lock() |
- defer h.core.mu.Unlock() |
- |
- cParams := C.MallocDuplicateBufferHandleParams() |
- defer C.FreeDuplicateBufferHandleParams(cParams) |
- result := C.MojoDuplicateBufferHandle(h.mojoHandle.cValue(), opts.cValue(cParams.opts), cParams.duplicate) |
- return MojoResult(result), core.acquireCHandle(*cParams.duplicate).ToSharedBufferHandle() |
+ r, dup := sysImpl.DuplicateBufferHandle(uint32(h.mojoHandle), flags) |
+ h.core.mu.Unlock() |
+ return MojoResult(r), core.AcquireNativeHandle(MojoHandle(dup)).ToSharedBufferHandle() |
} |
func (h *sharedBuffer) MapBuffer(offset uint64, numBytes int, flags MojoMapBufferFlags) (MojoResult, []byte) { |
h.core.mu.Lock() |
- defer h.core.mu.Unlock() |
- |
- cParams := C.MallocMapBufferParams() |
- defer C.FreeMapBufferParams(cParams) |
- result := C.MojoMapBuffer(h.mojoHandle.cValue(), C.uint64_t(offset), C.uint64_t(numBytes), cParams.buffer, flags.cValue()) |
- if result != C.MOJO_RESULT_OK { |
- return MojoResult(result), nil |
+ r, buf := sysImpl.MapBuffer(uint32(h.mojoHandle), offset, uint64(numBytes), uint32(flags)) |
+ h.core.mu.Unlock() |
+ if r != 0 { |
+ return MojoResult(r), nil |
} |
- return MOJO_RESULT_OK, unsafeByteSlice(unsafe.Pointer(*cParams.buffer), numBytes) |
+ |
+ return MojoResult(r), buf |
} |
func (h *sharedBuffer) UnmapBuffer(buffer []byte) MojoResult { |
h.core.mu.Lock() |
- defer h.core.mu.Unlock() |
+ r := sysImpl.UnmapBuffer(buffer) |
+ h.core.mu.Unlock() |
+ return MojoResult(r) |
+} |
+ |
+func newUnsafeSlice(ptr unsafe.Pointer, length int) unsafe.Pointer { |
+ header := &reflect.SliceHeader{ |
+ Data: uintptr(ptr), |
+ Len: length, |
+ Cap: length, |
+ } |
+ return unsafe.Pointer(header) |
+} |
- return MojoResult(C.MojoUnmapBuffer(unsafe.Pointer(&buffer[0]))) |
+func unsafeByteSlice(ptr unsafe.Pointer, length int) []byte { |
+ return *(*[]byte)(newUnsafeSlice(ptr, length)) |
} |