blob: f3048f877918d78252457048ddbb66abf732f116 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package system
import (
"reflect"
"unsafe"
)
// SharedBufferHandle is a handle for a buffer that can be shared between
// applications.
type SharedBufferHandle interface {
Handle
// DuplicateBufferHandle duplicates the handle to a buffer.
DuplicateBufferHandle(opts *DuplicateBufferHandleOptions) (MojoResult, SharedBufferHandle)
// MapBuffer maps the requested part of the shared buffer given by handle
// into memory with specified flags. On success, it returns slice that
// points to the requested shared buffer.
MapBuffer(offset uint64, numBytes int, flags MojoMapBufferFlags) (MojoResult, []byte)
// UnmapBuffer unmaps a buffer that was returned by MapBuffer.
UnmapBuffer(buffer []byte) MojoResult
}
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()
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()
r, buf := sysImpl.MapBuffer(uint32(h.mojoHandle), offset, uint64(numBytes), uint32(flags))
h.core.mu.Unlock()
if r != 0 {
return MojoResult(r), nil
}
return MojoResult(r), buf
}
func (h *sharedBuffer) UnmapBuffer(buffer []byte) MojoResult {
h.core.mu.Lock()
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)
}
func unsafeByteSlice(ptr unsafe.Pointer, length int) []byte {
return *(*[]byte)(newUnsafeSlice(ptr, length))
}