Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1312)

Unified Diff: mojo/system/message_pipe_dispatcher.cc

Issue 621153003: Move mojo edk into mojo/edk (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix checkdeps Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/system/message_pipe_dispatcher.h ('k') | mojo/system/message_pipe_dispatcher_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/system/message_pipe_dispatcher.cc
diff --git a/mojo/system/message_pipe_dispatcher.cc b/mojo/system/message_pipe_dispatcher.cc
deleted file mode 100644
index abe0ecb98f99ed87482313719e1df39b67586c7e..0000000000000000000000000000000000000000
--- a/mojo/system/message_pipe_dispatcher.cc
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright 2013 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/message_pipe_dispatcher.h"
-
-#include "base/logging.h"
-#include "mojo/system/channel.h"
-#include "mojo/system/channel_endpoint.h"
-#include "mojo/system/constants.h"
-#include "mojo/system/local_message_pipe_endpoint.h"
-#include "mojo/system/memory.h"
-#include "mojo/system/message_in_transit.h"
-#include "mojo/system/message_pipe.h"
-#include "mojo/system/options_validation.h"
-#include "mojo/system/proxy_message_pipe_endpoint.h"
-
-namespace mojo {
-namespace system {
-
-namespace {
-
-const unsigned kInvalidPort = static_cast<unsigned>(-1);
-
-struct SerializedMessagePipeDispatcher {
- MessageInTransit::EndpointId endpoint_id;
-};
-
-} // namespace
-
-// MessagePipeDispatcher -------------------------------------------------------
-
-// static
-const MojoCreateMessagePipeOptions
- MessagePipeDispatcher::kDefaultCreateOptions = {
- static_cast<uint32_t>(sizeof(MojoCreateMessagePipeOptions)),
- MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE};
-
-MessagePipeDispatcher::MessagePipeDispatcher(
- const MojoCreateMessagePipeOptions& /*validated_options*/)
- : port_(kInvalidPort) {
-}
-
-// static
-MojoResult MessagePipeDispatcher::ValidateCreateOptions(
- UserPointer<const MojoCreateMessagePipeOptions> in_options,
- MojoCreateMessagePipeOptions* out_options) {
- const MojoCreateMessagePipeOptionsFlags kKnownFlags =
- MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE;
-
- *out_options = kDefaultCreateOptions;
- if (in_options.IsNull())
- return MOJO_RESULT_OK;
-
- UserOptionsReader<MojoCreateMessagePipeOptions> reader(in_options);
- if (!reader.is_valid())
- return MOJO_RESULT_INVALID_ARGUMENT;
-
- if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateMessagePipeOptions, 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 MessagePipeDispatcher::Init(scoped_refptr<MessagePipe> message_pipe,
- unsigned port) {
- DCHECK(message_pipe.get());
- DCHECK(port == 0 || port == 1);
-
- message_pipe_ = message_pipe;
- port_ = port;
-}
-
-Dispatcher::Type MessagePipeDispatcher::GetType() const {
- return kTypeMessagePipe;
-}
-
-// static
-scoped_refptr<MessagePipeDispatcher>
-MessagePipeDispatcher::CreateRemoteMessagePipe(
- scoped_refptr<ChannelEndpoint>* channel_endpoint) {
- scoped_refptr<MessagePipe> message_pipe(
- MessagePipe::CreateLocalProxy(channel_endpoint));
- scoped_refptr<MessagePipeDispatcher> dispatcher(
- new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions));
- dispatcher->Init(message_pipe, 0);
- return dispatcher;
-}
-
-// static
-scoped_refptr<MessagePipeDispatcher> MessagePipeDispatcher::Deserialize(
- Channel* channel,
- const void* source,
- size_t size) {
- if (size != sizeof(SerializedMessagePipeDispatcher)) {
- LOG(ERROR) << "Invalid serialized message pipe dispatcher";
- return scoped_refptr<MessagePipeDispatcher>();
- }
-
- scoped_refptr<ChannelEndpoint> channel_endpoint;
- scoped_refptr<MessagePipeDispatcher> dispatcher =
- CreateRemoteMessagePipe(&channel_endpoint);
-
- MessageInTransit::EndpointId remote_id =
- static_cast<const SerializedMessagePipeDispatcher*>(source)->endpoint_id;
- if (remote_id == MessageInTransit::kInvalidEndpointId) {
- // This means that the other end was closed, and there were no messages
- // enqueued for us.
- // TODO(vtl): This is wrong. We should produce a "dead" message pipe
- // dispatcher.
- NOTIMPLEMENTED();
- return scoped_refptr<MessagePipeDispatcher>();
- }
- MessageInTransit::EndpointId local_id =
- channel->AttachEndpoint(channel_endpoint);
- if (local_id == MessageInTransit::kInvalidEndpointId) {
- LOG(ERROR) << "Failed to deserialize message pipe dispatcher (failed to "
- "attach; remote ID = " << remote_id << ")";
- return scoped_refptr<MessagePipeDispatcher>();
- }
- DVLOG(2) << "Deserializing message pipe dispatcher (remote ID = " << remote_id
- << ", new local ID = " << local_id << ")";
-
- if (!channel->RunMessagePipeEndpoint(local_id, remote_id)) {
- // In general, this shouldn't fail, since we generated |local_id| locally.
- NOTREACHED();
- return scoped_refptr<MessagePipeDispatcher>();
- }
-
- // TODO(vtl): FIXME -- Need some error handling here.
- channel->RunRemoteMessagePipeEndpoint(local_id, remote_id);
- return dispatcher;
-}
-
-MessagePipeDispatcher::~MessagePipeDispatcher() {
- // |Close()|/|CloseImplNoLock()| should have taken care of the pipe.
- DCHECK(!message_pipe_.get());
-}
-
-MessagePipe* MessagePipeDispatcher::GetMessagePipeNoLock() const {
- lock().AssertAcquired();
- return message_pipe_.get();
-}
-
-unsigned MessagePipeDispatcher::GetPortNoLock() const {
- lock().AssertAcquired();
- return port_;
-}
-
-void MessagePipeDispatcher::CancelAllWaitersNoLock() {
- lock().AssertAcquired();
- message_pipe_->CancelAllWaiters(port_);
-}
-
-void MessagePipeDispatcher::CloseImplNoLock() {
- lock().AssertAcquired();
- message_pipe_->Close(port_);
- message_pipe_ = nullptr;
- port_ = kInvalidPort;
-}
-
-scoped_refptr<Dispatcher>
-MessagePipeDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() {
- lock().AssertAcquired();
-
- // TODO(vtl): Currently, there are no options, so we just use
- // |kDefaultCreateOptions|. Eventually, we'll have to duplicate the options
- // too.
- scoped_refptr<MessagePipeDispatcher> rv =
- new MessagePipeDispatcher(kDefaultCreateOptions);
- rv->Init(message_pipe_, port_);
- message_pipe_ = nullptr;
- port_ = kInvalidPort;
- return scoped_refptr<Dispatcher>(rv.get());
-}
-
-MojoResult MessagePipeDispatcher::WriteMessageImplNoLock(
- UserPointer<const void> bytes,
- uint32_t num_bytes,
- std::vector<DispatcherTransport>* transports,
- MojoWriteMessageFlags flags) {
- DCHECK(!transports || (transports->size() > 0 &&
- transports->size() <= kMaxMessageNumHandles));
-
- lock().AssertAcquired();
-
- if (num_bytes > kMaxMessageNumBytes)
- return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
- return message_pipe_->WriteMessage(
- port_, bytes, num_bytes, transports, flags);
-}
-
-MojoResult MessagePipeDispatcher::ReadMessageImplNoLock(
- UserPointer<void> bytes,
- UserPointer<uint32_t> num_bytes,
- DispatcherVector* dispatchers,
- uint32_t* num_dispatchers,
- MojoReadMessageFlags flags) {
- lock().AssertAcquired();
- return message_pipe_->ReadMessage(
- port_, bytes, num_bytes, dispatchers, num_dispatchers, flags);
-}
-
-HandleSignalsState MessagePipeDispatcher::GetHandleSignalsStateImplNoLock()
- const {
- lock().AssertAcquired();
- return message_pipe_->GetHandleSignalsState(port_);
-}
-
-MojoResult MessagePipeDispatcher::AddWaiterImplNoLock(
- Waiter* waiter,
- MojoHandleSignals signals,
- uint32_t context,
- HandleSignalsState* signals_state) {
- lock().AssertAcquired();
- return message_pipe_->AddWaiter(
- port_, waiter, signals, context, signals_state);
-}
-
-void MessagePipeDispatcher::RemoveWaiterImplNoLock(
- Waiter* waiter,
- HandleSignalsState* signals_state) {
- lock().AssertAcquired();
- message_pipe_->RemoveWaiter(port_, waiter, signals_state);
-}
-
-void MessagePipeDispatcher::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(SerializedMessagePipeDispatcher);
- *max_platform_handles = 0;
-}
-
-bool MessagePipeDispatcher::EndSerializeAndCloseImplNoLock(
- Channel* channel,
- void* destination,
- size_t* actual_size,
- embedder::PlatformHandleVector* /*platform_handles*/) {
- DCHECK(HasOneRef()); // Only one ref => no need to take the lock.
-
- // Convert the local endpoint to a proxy endpoint (moving the message queue)
- // and attach it to the channel.
- MessageInTransit::EndpointId endpoint_id =
- channel->AttachEndpoint(message_pipe_->ConvertLocalToProxy(port_));
- // Note: It's okay to get an endpoint ID of |kInvalidEndpointId|. (It's
- // possible that the other endpoint -- the one that we're not sending -- was
- // closed in the intervening time.) In that case, we need to deserialize a
- // "dead" message pipe dispatcher on the other end. (Note that this is
- // different from just producing |MOJO_HANDLE_INVALID|.)
- DVLOG(2) << "Serializing message pipe dispatcher (local ID = " << endpoint_id
- << ")";
-
- // We now have a local ID. Before we can run the proxy endpoint, we need to
- // get an ack back from the other side with the remote ID.
- static_cast<SerializedMessagePipeDispatcher*>(destination)->endpoint_id =
- endpoint_id;
-
- message_pipe_ = nullptr;
- port_ = kInvalidPort;
-
- *actual_size = sizeof(SerializedMessagePipeDispatcher);
- return true;
-}
-
-// MessagePipeDispatcherTransport ----------------------------------------------
-
-MessagePipeDispatcherTransport::MessagePipeDispatcherTransport(
- DispatcherTransport transport)
- : DispatcherTransport(transport) {
- DCHECK_EQ(message_pipe_dispatcher()->GetType(), Dispatcher::kTypeMessagePipe);
-}
-
-} // namespace system
-} // namespace mojo
« no previous file with comments | « mojo/system/message_pipe_dispatcher.h ('k') | mojo/system/message_pipe_dispatcher_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698