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

Unified Diff: mojo/system/proxy_message_pipe_endpoint.cc

Issue 68303007: Mojo: More plumbing required to transfer handles over MessagePipes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month 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/proxy_message_pipe_endpoint.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/system/proxy_message_pipe_endpoint.cc
diff --git a/mojo/system/proxy_message_pipe_endpoint.cc b/mojo/system/proxy_message_pipe_endpoint.cc
index f9b9e56e3da2d6da127a3a0a8d2f5c1a48d7a223..91a77602fe6f1c243895ef9bc55c59d0b1340109 100644
--- a/mojo/system/proxy_message_pipe_endpoint.cc
+++ b/mojo/system/proxy_message_pipe_endpoint.cc
@@ -51,10 +51,14 @@ bool ProxyMessagePipeEndpoint::OnPeerClose() {
DCHECK(is_peer_open_);
is_peer_open_ = false;
- if (EnqueueMessage(MessageInTransit::Create(
- MessageInTransit::kTypeMessagePipe,
- MessageInTransit::kSubtypeMessagePipePeerClosed,
- NULL, 0), NULL) != MOJO_RESULT_OK) {
+ MessageInTransit* message =
+ MessageInTransit::Create(MessageInTransit::kTypeMessagePipe,
+ MessageInTransit::kSubtypeMessagePipePeerClosed,
+ NULL, 0);
+ if (CanEnqueueMessage(message, NULL) == MOJO_RESULT_OK) {
+ EnqueueMessage(message, NULL);
+ } else {
+ message->Destroy();
// TODO(vtl): Do something more sensible on error here?
LOG(WARNING) << "Failed to send peer closed control message";
}
@@ -65,34 +69,39 @@ bool ProxyMessagePipeEndpoint::OnPeerClose() {
return !paused_message_queue_.empty();
}
-MojoResult ProxyMessagePipeEndpoint::EnqueueMessage(
- MessageInTransit* message,
+MojoResult ProxyMessagePipeEndpoint::CanEnqueueMessage(
+ const MessageInTransit* /*message*/,
const std::vector<Dispatcher*>* dispatchers) {
- DCHECK(is_open_);
- // If our (local) peer isn't open, we should only be enqueueing our own
- // control messages.
- DCHECK(is_peer_open_ ||
- (message->type() == MessageInTransit::kTypeMessagePipe));
-
// TODO(vtl): Support sending handles over OS pipes.
if (dispatchers) {
- message->Destroy();
NOTIMPLEMENTED();
return MOJO_RESULT_UNIMPLEMENTED;
}
+ return MOJO_RESULT_OK;
+}
- MojoResult rv = MOJO_RESULT_OK;
+void ProxyMessagePipeEndpoint::EnqueueMessage(
+ MessageInTransit* message,
+ std::vector<scoped_refptr<Dispatcher> >* dispatchers) {
+ DCHECK(is_open_);
+ // If our (local) peer isn't open, we should only be enqueueing our own
+ // control messages.
+ DCHECK(is_peer_open_ ||
+ (message->type() == MessageInTransit::kTypeMessagePipe));
+
+ // TODO(vtl)
+ DCHECK(!dispatchers || dispatchers->empty());
if (is_running()) {
message->set_source_id(local_id_);
message->set_destination_id(remote_id_);
+ // TODO(vtl): Figure out error handling here (where it's rather late) --
+ // maybe move whatever checks we can into |CanEnqueueMessage()|.
if (!channel_->WriteMessage(message))
- rv = MOJO_RESULT_FAILED_PRECONDITION;
+ LOG(WARNING) << "Failed to write message to channel";
} else {
paused_message_queue_.push_back(message);
}
-
- return rv;
}
void ProxyMessagePipeEndpoint::Attach(scoped_refptr<Channel> channel,
@@ -120,15 +129,17 @@ bool ProxyMessagePipeEndpoint::Run(MessageInTransit::EndpointId remote_id) {
remote_id_ = remote_id;
AssertConsistentState();
- MojoResult result = MOJO_RESULT_OK;
for (std::deque<MessageInTransit*>::iterator it =
paused_message_queue_.begin();
it != paused_message_queue_.end();
++it) {
- result = EnqueueMessage(*it, NULL);
- if (result != MOJO_RESULT_OK) {
+ if (CanEnqueueMessage(*it, NULL) == MOJO_RESULT_OK) {
+ EnqueueMessage(*it, NULL);
+ } else {
+ (*it)->Destroy();
// TODO(vtl): Do something more sensible on error here?
LOG(WARNING) << "Failed to send message";
+ // TODO(vtl): Abort?
}
}
paused_message_queue_.clear();
« no previous file with comments | « mojo/system/proxy_message_pipe_endpoint.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698