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..e26d10a2894861e3d454be19dea592ba80dacf60 |
--- /dev/null |
+++ b/mojo/public/cpp/system/buffer.h |
@@ -0,0 +1,113 @@ |
+// 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 <assert.h> |
+ |
+#include "mojo/public/c/system/buffer.h" |
+#include "mojo/public/cpp/system/handle.h" |
+#include "mojo/public/cpp/system/macros.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), |
+ 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_ |