Index: mojo/edk/system/shared_buffer_dispatcher.cc |
diff --git a/mojo/edk/system/shared_buffer_dispatcher.cc b/mojo/edk/system/shared_buffer_dispatcher.cc |
deleted file mode 100644 |
index 7e345d93f837af69627fc25920470657dff3191f..0000000000000000000000000000000000000000 |
--- a/mojo/edk/system/shared_buffer_dispatcher.cc |
+++ /dev/null |
@@ -1,276 +0,0 @@ |
-// 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/edk/system/shared_buffer_dispatcher.h" |
- |
-#include <limits> |
- |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "mojo/edk/embedder/platform_support.h" |
-#include "mojo/edk/system/channel.h" |
-#include "mojo/edk/system/constants.h" |
-#include "mojo/edk/system/memory.h" |
-#include "mojo/edk/system/options_validation.h" |
-#include "mojo/public/c/system/macros.h" |
- |
-namespace mojo { |
-namespace system { |
- |
-namespace { |
- |
-struct SerializedSharedBufferDispatcher { |
- size_t num_bytes; |
- size_t platform_handle_index; |
-}; |
- |
-} // namespace |
- |
-// static |
-const MojoCreateSharedBufferOptions |
- SharedBufferDispatcher::kDefaultCreateOptions = { |
- static_cast<uint32_t>(sizeof(MojoCreateSharedBufferOptions)), |
- MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE}; |
- |
-// static |
-MojoResult SharedBufferDispatcher::ValidateCreateOptions( |
- UserPointer<const MojoCreateSharedBufferOptions> in_options, |
- MojoCreateSharedBufferOptions* out_options) { |
- const MojoCreateSharedBufferOptionsFlags kKnownFlags = |
- MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE; |
- |
- *out_options = kDefaultCreateOptions; |
- if (in_options.IsNull()) |
- return MOJO_RESULT_OK; |
- |
- UserOptionsReader<MojoCreateSharedBufferOptions> reader(in_options); |
- if (!reader.is_valid()) |
- return MOJO_RESULT_INVALID_ARGUMENT; |
- |
- if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateSharedBufferOptions, flags, reader)) |
- return MOJO_RESULT_OK; |
- if ((reader.options().flags & ~kKnownFlags)) |
- return MOJO_RESULT_UNIMPLEMENTED; |
- out_options->flags = reader.options().flags; |
- |
- // Checks for fields beyond |flags|: |
- |
- // (Nothing here yet.) |
- |
- return MOJO_RESULT_OK; |
-} |
- |
-// static |
-MojoResult SharedBufferDispatcher::Create( |
- embedder::PlatformSupport* platform_support, |
- const MojoCreateSharedBufferOptions& /*validated_options*/, |
- uint64_t num_bytes, |
- scoped_refptr<SharedBufferDispatcher>* result) { |
- if (!num_bytes) |
- return MOJO_RESULT_INVALID_ARGUMENT; |
- if (num_bytes > kMaxSharedMemoryNumBytes) |
- return MOJO_RESULT_RESOURCE_EXHAUSTED; |
- |
- scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer( |
- platform_support->CreateSharedBuffer(static_cast<size_t>(num_bytes))); |
- if (!shared_buffer.get()) |
- return MOJO_RESULT_RESOURCE_EXHAUSTED; |
- |
- *result = new SharedBufferDispatcher(shared_buffer); |
- return MOJO_RESULT_OK; |
-} |
- |
-Dispatcher::Type SharedBufferDispatcher::GetType() const { |
- return kTypeSharedBuffer; |
-} |
- |
-// static |
-scoped_refptr<SharedBufferDispatcher> SharedBufferDispatcher::Deserialize( |
- Channel* channel, |
- const void* source, |
- size_t size, |
- embedder::PlatformHandleVector* platform_handles) { |
- DCHECK(channel); |
- |
- if (size != sizeof(SerializedSharedBufferDispatcher)) { |
- LOG(ERROR) << "Invalid serialized shared buffer dispatcher (bad size)"; |
- return scoped_refptr<SharedBufferDispatcher>(); |
- } |
- |
- const SerializedSharedBufferDispatcher* serialization = |
- static_cast<const SerializedSharedBufferDispatcher*>(source); |
- size_t num_bytes = serialization->num_bytes; |
- size_t platform_handle_index = serialization->platform_handle_index; |
- |
- if (!num_bytes) { |
- LOG(ERROR) |
- << "Invalid serialized shared buffer dispatcher (invalid num_bytes)"; |
- return scoped_refptr<SharedBufferDispatcher>(); |
- } |
- |
- if (!platform_handles || platform_handle_index >= platform_handles->size()) { |
- LOG(ERROR) |
- << "Invalid serialized shared buffer dispatcher (missing handles)"; |
- return scoped_refptr<SharedBufferDispatcher>(); |
- } |
- |
- // Starts off invalid, which is what we want. |
- embedder::PlatformHandle platform_handle; |
- // We take ownership of the handle, so we have to invalidate the one in |
- // |platform_handles|. |
- std::swap(platform_handle, (*platform_handles)[platform_handle_index]); |
- |
- // Wrapping |platform_handle| in a |ScopedPlatformHandle| means that it'll be |
- // closed even if creation fails. |
- scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer( |
- channel->platform_support()->CreateSharedBufferFromHandle( |
- num_bytes, embedder::ScopedPlatformHandle(platform_handle))); |
- if (!shared_buffer.get()) { |
- LOG(ERROR) |
- << "Invalid serialized shared buffer dispatcher (invalid num_bytes?)"; |
- return scoped_refptr<SharedBufferDispatcher>(); |
- } |
- |
- return scoped_refptr<SharedBufferDispatcher>( |
- new SharedBufferDispatcher(shared_buffer)); |
-} |
- |
-SharedBufferDispatcher::SharedBufferDispatcher( |
- scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer) |
- : shared_buffer_(shared_buffer) { |
- DCHECK(shared_buffer_.get()); |
-} |
- |
-SharedBufferDispatcher::~SharedBufferDispatcher() { |
-} |
- |
-// static |
-MojoResult SharedBufferDispatcher::ValidateDuplicateOptions( |
- UserPointer<const MojoDuplicateBufferHandleOptions> in_options, |
- MojoDuplicateBufferHandleOptions* out_options) { |
- const MojoDuplicateBufferHandleOptionsFlags kKnownFlags = |
- MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE; |
- static const MojoDuplicateBufferHandleOptions kDefaultOptions = { |
- static_cast<uint32_t>(sizeof(MojoDuplicateBufferHandleOptions)), |
- MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE}; |
- |
- *out_options = kDefaultOptions; |
- if (in_options.IsNull()) |
- return MOJO_RESULT_OK; |
- |
- UserOptionsReader<MojoDuplicateBufferHandleOptions> reader(in_options); |
- if (!reader.is_valid()) |
- return MOJO_RESULT_INVALID_ARGUMENT; |
- |
- if (!OPTIONS_STRUCT_HAS_MEMBER( |
- MojoDuplicateBufferHandleOptions, flags, reader)) |
- return MOJO_RESULT_OK; |
- if ((reader.options().flags & ~kKnownFlags)) |
- return MOJO_RESULT_UNIMPLEMENTED; |
- out_options->flags = reader.options().flags; |
- |
- // Checks for fields beyond |flags|: |
- |
- // (Nothing here yet.) |
- |
- return MOJO_RESULT_OK; |
-} |
- |
-void SharedBufferDispatcher::CloseImplNoLock() { |
- lock().AssertAcquired(); |
- DCHECK(shared_buffer_.get()); |
- shared_buffer_ = nullptr; |
-} |
- |
-scoped_refptr<Dispatcher> |
-SharedBufferDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() { |
- lock().AssertAcquired(); |
- DCHECK(shared_buffer_.get()); |
- scoped_refptr<embedder::PlatformSharedBuffer> shared_buffer; |
- shared_buffer.swap(shared_buffer_); |
- return scoped_refptr<Dispatcher>(new SharedBufferDispatcher(shared_buffer)); |
-} |
- |
-MojoResult SharedBufferDispatcher::DuplicateBufferHandleImplNoLock( |
- UserPointer<const MojoDuplicateBufferHandleOptions> options, |
- scoped_refptr<Dispatcher>* new_dispatcher) { |
- lock().AssertAcquired(); |
- |
- MojoDuplicateBufferHandleOptions validated_options; |
- MojoResult result = ValidateDuplicateOptions(options, &validated_options); |
- if (result != MOJO_RESULT_OK) |
- return result; |
- |
- *new_dispatcher = new SharedBufferDispatcher(shared_buffer_); |
- return MOJO_RESULT_OK; |
-} |
- |
-MojoResult SharedBufferDispatcher::MapBufferImplNoLock( |
- uint64_t offset, |
- uint64_t num_bytes, |
- MojoMapBufferFlags flags, |
- scoped_ptr<embedder::PlatformSharedBufferMapping>* mapping) { |
- lock().AssertAcquired(); |
- DCHECK(shared_buffer_.get()); |
- |
- if (offset > static_cast<uint64_t>(std::numeric_limits<size_t>::max())) |
- return MOJO_RESULT_INVALID_ARGUMENT; |
- if (num_bytes > static_cast<uint64_t>(std::numeric_limits<size_t>::max())) |
- return MOJO_RESULT_INVALID_ARGUMENT; |
- |
- if (!shared_buffer_->IsValidMap(static_cast<size_t>(offset), |
- static_cast<size_t>(num_bytes))) |
- return MOJO_RESULT_INVALID_ARGUMENT; |
- |
- DCHECK(mapping); |
- *mapping = shared_buffer_->MapNoCheck(static_cast<size_t>(offset), |
- static_cast<size_t>(num_bytes)); |
- if (!*mapping) |
- return MOJO_RESULT_RESOURCE_EXHAUSTED; |
- |
- return MOJO_RESULT_OK; |
-} |
- |
-void SharedBufferDispatcher::StartSerializeImplNoLock( |
- Channel* /*channel*/, |
- size_t* max_size, |
- size_t* max_platform_handles) { |
- DCHECK(HasOneRef()); // Only one ref => no need to take the lock. |
- *max_size = sizeof(SerializedSharedBufferDispatcher); |
- *max_platform_handles = 1; |
-} |
- |
-bool SharedBufferDispatcher::EndSerializeAndCloseImplNoLock( |
- Channel* /*channel*/, |
- void* destination, |
- size_t* actual_size, |
- embedder::PlatformHandleVector* platform_handles) { |
- DCHECK(HasOneRef()); // Only one ref => no need to take the lock. |
- DCHECK(shared_buffer_.get()); |
- |
- SerializedSharedBufferDispatcher* serialization = |
- static_cast<SerializedSharedBufferDispatcher*>(destination); |
- // If there's only one reference to |shared_buffer_|, then it's ours (and no |
- // one else can make any more references to it), so we can just take its |
- // handle. |
- embedder::ScopedPlatformHandle platform_handle( |
- shared_buffer_->HasOneRef() ? shared_buffer_->PassPlatformHandle() |
- : shared_buffer_->DuplicatePlatformHandle()); |
- if (!platform_handle.is_valid()) { |
- shared_buffer_ = nullptr; |
- return false; |
- } |
- |
- serialization->num_bytes = shared_buffer_->GetNumBytes(); |
- serialization->platform_handle_index = platform_handles->size(); |
- platform_handles->push_back(platform_handle.release()); |
- *actual_size = sizeof(SerializedSharedBufferDispatcher); |
- |
- shared_buffer_ = nullptr; |
- |
- return true; |
-} |
- |
-} // namespace system |
-} // namespace mojo |