diff options
Diffstat (limited to 'chromium/mojo/system/raw_shared_buffer.cc')
-rw-r--r-- | chromium/mojo/system/raw_shared_buffer.cc | 86 |
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 |