// 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