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

Side by Side Diff: mojo/system/channel.cc

Issue 265753006: Mojo: Factor MessageInTransit secondary buffer stuff out into a separate class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: oops Created 6 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/mojo.gyp ('k') | mojo/system/dispatcher.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/system/channel.h" 5 #include "mojo/system/channel.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
14 #include "mojo/system/message_pipe_endpoint.h" 14 #include "mojo/system/message_pipe_endpoint.h"
15 #include "mojo/system/transport_data.h"
15 16
16 namespace mojo { 17 namespace mojo {
17 namespace system { 18 namespace system {
18 19
19 COMPILE_ASSERT(Channel::kBootstrapEndpointId != 20 COMPILE_ASSERT(Channel::kBootstrapEndpointId !=
20 MessageInTransit::kInvalidEndpointId, 21 MessageInTransit::kInvalidEndpointId,
21 kBootstrapEndpointId_is_invalid); 22 kBootstrapEndpointId_is_invalid);
22 23
23 STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::EndpointId 24 STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::EndpointId
24 Channel::kBootstrapEndpointId; 25 Channel::kBootstrapEndpointId;
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 endpoint_info = it->second; 341 endpoint_info = it->second;
341 } 342 }
342 343
343 // Ignore messages for zombie endpoints (not an error). 344 // Ignore messages for zombie endpoints (not an error).
344 if (endpoint_info.state != EndpointInfo::STATE_NORMAL) { 345 if (endpoint_info.state != EndpointInfo::STATE_NORMAL) {
345 DVLOG(2) << "Ignoring downstream message for zombie endpoint (local ID = " 346 DVLOG(2) << "Ignoring downstream message for zombie endpoint (local ID = "
346 << local_id << ", remote ID = " << message_view.source_id() << ")"; 347 << local_id << ", remote ID = " << message_view.source_id() << ")";
347 return; 348 return;
348 } 349 }
349 350
350 // We need to duplicate the message, because |EnqueueMessage()| will take 351 // We need to duplicate the message (data), because |EnqueueMessage()| will
351 // ownership of it. 352 // take ownership of it.
352 scoped_ptr<MessageInTransit> message(new MessageInTransit(message_view)); 353 scoped_ptr<MessageInTransit> message(new MessageInTransit(message_view));
353 message->DeserializeDispatchers(this); 354 if (message_view.transport_data_buffer_size() > 0) {
355 DCHECK(message_view.transport_data_buffer());
356 message->SetDispatchers(
357 TransportData::DeserializeDispatchersFromBuffer(
358 message_view.transport_data_buffer(),
359 message_view.transport_data_buffer_size(),
360 this));
361 }
354 MojoResult result = endpoint_info.message_pipe->EnqueueMessage( 362 MojoResult result = endpoint_info.message_pipe->EnqueueMessage(
355 MessagePipe::GetPeerPort(endpoint_info.port), message.Pass()); 363 MessagePipe::GetPeerPort(endpoint_info.port), message.Pass());
356 if (result != MOJO_RESULT_OK) { 364 if (result != MOJO_RESULT_OK) {
357 // TODO(vtl): This might be a "non-error", e.g., if the destination endpoint 365 // TODO(vtl): This might be a "non-error", e.g., if the destination endpoint
358 // has been closed (in an unavoidable race). This might also be a "remote" 366 // has been closed (in an unavoidable race). This might also be a "remote"
359 // error, e.g., if the remote side is sending invalid control messages (to 367 // error, e.g., if the remote side is sending invalid control messages (to
360 // the message pipe). 368 // the message pipe).
361 HandleLocalError(base::StringPrintf( 369 HandleLocalError(base::StringPrintf(
362 "Failed to enqueue message to local ID %u (result %d)", 370 "Failed to enqueue message to local ID %u (result %d)",
363 static_cast<unsigned>(local_id), static_cast<int>(result))); 371 static_cast<unsigned>(local_id), static_cast<int>(result)));
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 459
452 return true; 460 return true;
453 } 461 }
454 462
455 bool Channel::SendControlMessage(MessageInTransit::Subtype subtype, 463 bool Channel::SendControlMessage(MessageInTransit::Subtype subtype,
456 MessageInTransit::EndpointId local_id, 464 MessageInTransit::EndpointId local_id,
457 MessageInTransit::EndpointId remote_id) { 465 MessageInTransit::EndpointId remote_id) {
458 DVLOG(2) << "Sending channel control message: subtype " << subtype 466 DVLOG(2) << "Sending channel control message: subtype " << subtype
459 << ", local ID " << local_id << ", remote ID " << remote_id; 467 << ", local ID " << local_id << ", remote ID " << remote_id;
460 scoped_ptr<MessageInTransit> message(new MessageInTransit( 468 scoped_ptr<MessageInTransit> message(new MessageInTransit(
461 MessageInTransit::kTypeChannel, subtype, 0, 0, NULL)); 469 MessageInTransit::kTypeChannel, subtype, 0, NULL));
462 message->set_source_id(local_id); 470 message->set_source_id(local_id);
463 message->set_destination_id(remote_id); 471 message->set_destination_id(remote_id);
464 return WriteMessage(message.Pass()); 472 return WriteMessage(message.Pass());
465 } 473 }
466 474
467 void Channel::HandleRemoteError(const base::StringPiece& error_message) { 475 void Channel::HandleRemoteError(const base::StringPiece& error_message) {
468 // TODO(vtl): Is this how we really want to handle this? Probably we want to 476 // TODO(vtl): Is this how we really want to handle this? Probably we want to
469 // terminate the connection, since it's spewing invalid stuff. 477 // terminate the connection, since it's spewing invalid stuff.
470 LOG(WARNING) << error_message; 478 LOG(WARNING) << error_message;
471 } 479 }
472 480
473 void Channel::HandleLocalError(const base::StringPiece& error_message) { 481 void Channel::HandleLocalError(const base::StringPiece& error_message) {
474 // TODO(vtl): Is this how we really want to handle this? 482 // TODO(vtl): Is this how we really want to handle this?
475 // Sometimes we'll want to propagate the error back to the message pipe 483 // Sometimes we'll want to propagate the error back to the message pipe
476 // (endpoint), and notify it that the remote is (effectively) closed. 484 // (endpoint), and notify it that the remote is (effectively) closed.
477 // Sometimes we'll want to kill the channel (and notify all the endpoints that 485 // Sometimes we'll want to kill the channel (and notify all the endpoints that
478 // their remotes are dead. 486 // their remotes are dead.
479 LOG(WARNING) << error_message; 487 LOG(WARNING) << error_message;
480 } 488 }
481 489
482 } // namespace system 490 } // namespace system
483 } // namespace mojo 491 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/mojo.gyp ('k') | mojo/system/dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698