Chromium Code Reviews| Index: mojo/services/media/common/cpp/mapped_shared_buffer.cc |
| diff --git a/mojo/services/media/common/cpp/mapped_shared_buffer.cc b/mojo/services/media/common/cpp/mapped_shared_buffer.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..db2de1de164c039abb96366d5b9f61b75159674d |
| --- /dev/null |
| +++ b/mojo/services/media/common/cpp/mapped_shared_buffer.cc |
| @@ -0,0 +1,101 @@ |
| +// Copyright 2015 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 <cassert> |
|
johngro
2015/12/05 00:45:55
same comment as in the previous file, MOJO_DCHECK
dalesat
2015/12/07 18:30:20
Done.
|
| + |
| +#include "mojo/services/media/common/cpp/mapped_shared_buffer.h" |
| + |
| +namespace mojo { |
| +namespace media { |
| + |
| +MappedSharedBuffer::MappedSharedBuffer() {} |
| + |
| +MappedSharedBuffer::~MappedSharedBuffer() {} |
| + |
| +void MappedSharedBuffer::InitNew(uint64_t size) { |
| + assert(size > 0); |
| + |
| + buffer_.reset(new SharedBuffer(size)); |
| + handle_.reset(); |
| + |
| + InitInternal(buffer_->handle, size); |
| +} |
| + |
| +void MappedSharedBuffer::InitFromHandle( |
| + ScopedSharedBufferHandle handle, |
| + uint64_t size) { |
| + assert(handle.is_valid()); |
| + assert(size > 0); |
| + |
| + buffer_.reset(); |
| + handle_ = handle.Pass(); |
| + |
| + InitInternal(handle_, size); |
| +} |
| + |
| +void MappedSharedBuffer::InitInternal( |
| + ScopedSharedBufferHandle& handle, |
| + uint64_t size) { |
| + assert(handle.is_valid()); |
| + assert(size > 0); |
| + |
| + size_ = size; |
| + buffer_ptr_.reset(); |
| + |
| + void* ptr; |
| + auto result = MapBuffer( |
| + handle.get(), |
| + 0, // offset |
| + size, |
| + &ptr, |
| + MOJO_MAP_BUFFER_FLAG_NONE); |
| + assert(result == MOJO_RESULT_OK); |
| + assert(ptr); |
| + |
| + buffer_ptr_.reset(reinterpret_cast<uint8_t*>(ptr)); |
| + |
| + OnInit(); |
| +} |
| + |
| +bool MappedSharedBuffer::initialized() { |
| + return buffer_ptr_ != nullptr; |
| +} |
| + |
| +uint64_t MappedSharedBuffer::size() { |
| + return size_; |
| +} |
| + |
| +ScopedSharedBufferHandle MappedSharedBuffer::GetDuplicateHandle() { |
| + assert(initialized()); |
| + ScopedSharedBufferHandle handle; |
| + // TODO: We should create a read-only duplicate of the handle. |
|
johngro
2015/12/05 00:45:55
TODO(dalesat)
dalesat
2015/12/07 18:30:20
Removed. Also added a check so this works when Ini
|
| + DuplicateBuffer(buffer_->handle.get(), nullptr, &handle); |
| + return handle.Pass(); |
| +} |
| + |
| +void* MappedSharedBuffer::PtrFromOffset(uint64_t offset) { |
| + assert(buffer_ptr_); |
| + |
| + if (offset == FifoAllocator::kNullOffset) { |
| + return nullptr; |
| + } |
| + |
| + assert(offset < size_); |
| + return buffer_ptr_.get() + offset; |
| +} |
| + |
| +uint64_t MappedSharedBuffer::OffsetFromPtr(void *ptr) { |
| + assert(buffer_ptr_); |
| + if (ptr == nullptr) { |
| + return FifoAllocator::kNullOffset; |
| + } |
| + uint64_t offset = reinterpret_cast<uint8_t*>(ptr) - buffer_ptr_.get(); |
| + assert(offset < size_); |
| + return offset; |
| +} |
| + |
| +void MappedSharedBuffer::OnInit() {} |
| + |
| +} // namespace media |
| +} // namespace mojo |