summaryrefslogtreecommitdiffstats
path: root/chromium/mojo/system/raw_shared_buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/mojo/system/raw_shared_buffer.cc')
-rw-r--r--chromium/mojo/system/raw_shared_buffer.cc86
1 files changed, 86 insertions, 0 deletions
diff --git a/chromium/mojo/system/raw_shared_buffer.cc b/chromium/mojo/system/raw_shared_buffer.cc
new file mode 100644
index 00000000000..e6e3ebce239
--- /dev/null
+++ b/chromium/mojo/system/raw_shared_buffer.cc
@@ -0,0 +1,86 @@
+// Copyright 2014 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.
+
+#include "mojo/system/raw_shared_buffer.h"
+
+#include "base/logging.h"
+#include "mojo/embedder/platform_handle_utils.h"
+
+namespace mojo {
+namespace system {
+
+// static
+RawSharedBuffer* RawSharedBuffer::Create(size_t num_bytes) {
+ DCHECK_GT(num_bytes, 0u);
+
+ RawSharedBuffer* rv = new RawSharedBuffer(num_bytes);
+ if (!rv->Init()) {
+ // We can't just delete it directly, due to the "in destructor" (debug)
+ // check.
+ scoped_refptr<RawSharedBuffer> deleter(rv);
+ return NULL;
+ }
+
+ return rv;
+}
+
+RawSharedBuffer* RawSharedBuffer::CreateFromPlatformHandle(
+ size_t num_bytes,
+ embedder::ScopedPlatformHandle platform_handle) {
+ DCHECK_GT(num_bytes, 0u);
+
+ RawSharedBuffer* rv = new RawSharedBuffer(num_bytes);
+ if (!rv->InitFromPlatformHandle(platform_handle.Pass())) {
+ // We can't just delete it directly, due to the "in destructor" (debug)
+ // check.
+ scoped_refptr<RawSharedBuffer> deleter(rv);
+ return NULL;
+ }
+
+ return rv;
+}
+
+scoped_ptr<RawSharedBufferMapping> RawSharedBuffer::Map(size_t offset,
+ size_t length) {
+ if (!IsValidMap(offset, length))
+ return scoped_ptr<RawSharedBufferMapping>();
+
+ return MapNoCheck(offset, length);
+}
+
+bool RawSharedBuffer::IsValidMap(size_t offset, size_t length) {
+ if (offset > num_bytes_ || length == 0)
+ return false;
+
+ // Note: This is an overflow-safe check of |offset + length > num_bytes_|
+ // (that |num_bytes >= offset| is verified above).
+ if (length > num_bytes_ - offset)
+ return false;
+
+ return true;
+}
+
+scoped_ptr<RawSharedBufferMapping> RawSharedBuffer::MapNoCheck(size_t offset,
+ size_t length) {
+ DCHECK(IsValidMap(offset, length));
+ return MapImpl(offset, length);
+}
+
+embedder::ScopedPlatformHandle RawSharedBuffer::DuplicatePlatformHandle() {
+ return embedder::DuplicatePlatformHandle(handle_.get());
+}
+
+embedder::ScopedPlatformHandle RawSharedBuffer::PassPlatformHandle() {
+ DCHECK(HasOneRef());
+ return handle_.Pass();
+}
+
+RawSharedBuffer::RawSharedBuffer(size_t num_bytes) : num_bytes_(num_bytes) {
+}
+
+RawSharedBuffer::~RawSharedBuffer() {
+}
+
+} // namespace system
+} // namespace mojo