Chromium Code Reviews| Index: mojo/public/cpp/system/buffer.h |
| diff --git a/mojo/public/cpp/system/buffer.h b/mojo/public/cpp/system/buffer.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..dc8f15791ca5f889ada2f38e80dc2ce2875dfd6d |
| --- /dev/null |
| +++ b/mojo/public/cpp/system/buffer.h |
| @@ -0,0 +1,110 @@ |
| +// Copyright 2013 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. |
| + |
| +#ifndef MOJO_PUBLIC_CPP_SYSTEM_BUFFER_H_ |
| +#define MOJO_PUBLIC_CPP_SYSTEM_BUFFER_H_ |
| + |
| +#include "mojo/public/c/system/buffer.h" |
| +#include "mojo/public/cpp/system/handle.h" |
| + |
| +namespace mojo { |
| + |
| +// SharedBufferHandle ---------------------------------------------------------- |
| + |
| +class SharedBufferHandle : public Handle { |
| + public: |
| + SharedBufferHandle() {} |
| + explicit SharedBufferHandle(MojoHandle value) : Handle(value) {} |
| + |
| + // Copying and assignment allowed. |
| +}; |
| + |
| +MOJO_COMPILE_ASSERT(sizeof(SharedBufferHandle) == sizeof(Handle), |
|
viettrungluu
2014/07/15 00:44:09
I'd prefer that you not rely on the transitive inc
Hajime Morrita
2014/07/15 17:38:15
Makes sense. I added a comment on macros.h about t
|
| + bad_size_for_cpp_SharedBufferHandle); |
| + |
| +typedef ScopedHandleBase<SharedBufferHandle> ScopedSharedBufferHandle; |
| +MOJO_COMPILE_ASSERT(sizeof(ScopedSharedBufferHandle) == |
| + sizeof(SharedBufferHandle), |
| + bad_size_for_cpp_ScopedSharedBufferHandle); |
| + |
| +inline MojoResult CreateSharedBuffer( |
| + const MojoCreateSharedBufferOptions* options, |
| + uint64_t num_bytes, |
| + ScopedSharedBufferHandle* shared_buffer) { |
| + assert(shared_buffer); |
| + SharedBufferHandle handle; |
| + MojoResult rv = MojoCreateSharedBuffer(options, num_bytes, |
| + handle.mutable_value()); |
| + // Reset even on failure (reduces the chances that a "stale"/incorrect handle |
| + // will be used). |
| + shared_buffer->reset(handle); |
| + return rv; |
| +} |
| + |
| +// TODO(vtl): This (and also the functions below) are templatized to allow for |
| +// future/other buffer types. A bit "safer" would be to overload this function |
| +// manually. (The template enforces that the in and out handles to be of the |
| +// same type.) |
| +template <class BufferHandleType> |
| +inline MojoResult DuplicateBuffer( |
| + BufferHandleType buffer, |
| + const MojoDuplicateBufferHandleOptions* options, |
| + ScopedHandleBase<BufferHandleType>* new_buffer) { |
| + assert(new_buffer); |
| + BufferHandleType handle; |
| + MojoResult rv = MojoDuplicateBufferHandle( |
| + buffer.value(), options, handle.mutable_value()); |
| + // Reset even on failure (reduces the chances that a "stale"/incorrect handle |
| + // will be used). |
| + new_buffer->reset(handle); |
| + return rv; |
| +} |
| + |
| +template <class BufferHandleType> |
| +inline MojoResult MapBuffer(BufferHandleType buffer, |
| + uint64_t offset, |
| + uint64_t num_bytes, |
| + void** pointer, |
| + MojoMapBufferFlags flags) { |
| + assert(buffer.is_valid()); |
| + return MojoMapBuffer(buffer.value(), offset, num_bytes, pointer, flags); |
| +} |
| + |
| +inline MojoResult UnmapBuffer(void* pointer) { |
| + assert(pointer); |
| + return MojoUnmapBuffer(pointer); |
| +} |
| + |
| +// A wrapper class that automatically creates a shared buffer and owns the |
| +// handle. |
| +class SharedBuffer { |
| + public: |
| + explicit SharedBuffer(uint64_t num_bytes); |
| + SharedBuffer(uint64_t num_bytes, |
| + const MojoCreateSharedBufferOptions& options); |
| + ~SharedBuffer(); |
| + |
| + ScopedSharedBufferHandle handle; |
| +}; |
| + |
| +inline SharedBuffer::SharedBuffer(uint64_t num_bytes) { |
| + MojoResult result MOJO_ALLOW_UNUSED = |
| + CreateSharedBuffer(NULL, num_bytes, &handle); |
| + assert(result == MOJO_RESULT_OK); |
| +} |
| + |
| +inline SharedBuffer::SharedBuffer( |
| + uint64_t num_bytes, |
| + const MojoCreateSharedBufferOptions& options) { |
| + MojoResult result MOJO_ALLOW_UNUSED = |
| + CreateSharedBuffer(&options, num_bytes, &handle); |
| + assert(result == MOJO_RESULT_OK); |
| +} |
| + |
| +inline SharedBuffer::~SharedBuffer() { |
| +} |
| + |
| +} // namespace mojo |
| + |
| +#endif // MOJO_PUBLIC_CPP_SYSTEM_BUFFER_H_ |