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 |