| OLD | NEW | 
|    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/bind.h" |    9 #include "base/bind.h" | 
|   10 #include "base/compiler_specific.h" |   10 #include "base/compiler_specific.h" | 
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  268 } |  268 } | 
|  269  |  269  | 
|  270 Channel::~Channel() { |  270 Channel::~Channel() { | 
|  271   // The channel should have been shut down first. |  271   // The channel should have been shut down first. | 
|  272   DCHECK(!is_running_); |  272   DCHECK(!is_running_); | 
|  273 } |  273 } | 
|  274  |  274  | 
|  275 void Channel::OnReadMessage( |  275 void Channel::OnReadMessage( | 
|  276     const MessageInTransit::View& message_view, |  276     const MessageInTransit::View& message_view, | 
|  277     embedder::ScopedPlatformHandleVectorPtr platform_handles) { |  277     embedder::ScopedPlatformHandleVectorPtr platform_handles) { | 
 |  278   DCHECK(creation_thread_checker_.CalledOnValidThread()); | 
 |  279  | 
|  278   switch (message_view.type()) { |  280   switch (message_view.type()) { | 
|  279     case MessageInTransit::kTypeMessagePipeEndpoint: |  281     case MessageInTransit::kTypeMessagePipeEndpoint: | 
|  280     case MessageInTransit::kTypeMessagePipe: |  282     case MessageInTransit::kTypeMessagePipe: | 
|  281       OnReadMessageForDownstream(message_view, platform_handles.Pass()); |  283       OnReadMessageForDownstream(message_view, platform_handles.Pass()); | 
|  282       break; |  284       break; | 
|  283     case MessageInTransit::kTypeChannel: |  285     case MessageInTransit::kTypeChannel: | 
|  284       OnReadMessageForChannel(message_view, platform_handles.Pass()); |  286       OnReadMessageForChannel(message_view, platform_handles.Pass()); | 
|  285       break; |  287       break; | 
|  286     default: |  288     default: | 
|  287       HandleRemoteError( |  289       HandleRemoteError( | 
|  288           base::StringPrintf("Received message of invalid type %u", |  290           base::StringPrintf("Received message of invalid type %u", | 
|  289                              static_cast<unsigned>(message_view.type()))); |  291                              static_cast<unsigned>(message_view.type()))); | 
|  290       break; |  292       break; | 
|  291   } |  293   } | 
|  292 } |  294 } | 
|  293  |  295  | 
|  294 void Channel::OnError(Error error) { |  296 void Channel::OnError(Error error) { | 
 |  297   DCHECK(creation_thread_checker_.CalledOnValidThread()); | 
 |  298  | 
|  295   switch (error) { |  299   switch (error) { | 
|  296     case ERROR_READ_SHUTDOWN: |  300     case ERROR_READ_SHUTDOWN: | 
|  297       // The other side was cleanly closed, so this isn't actually an error. |  301       // The other side was cleanly closed, so this isn't actually an error. | 
|  298       DVLOG(1) << "RawChannel read error (shutdown)"; |  302       DVLOG(1) << "RawChannel read error (shutdown)"; | 
|  299       break; |  303       break; | 
|  300     case ERROR_READ_BROKEN: { |  304     case ERROR_READ_BROKEN: { | 
|  301       base::AutoLock locker(lock_); |  305       base::AutoLock locker(lock_); | 
|  302       LOG_IF(ERROR, !is_shutting_down_) |  306       LOG_IF(ERROR, !is_shutting_down_) | 
|  303           << "RawChannel read error (connection broken)"; |  307           << "RawChannel read error (connection broken)"; | 
|  304       break; |  308       break; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  316       // normal operation (but maybe the other side crashed). |  320       // normal operation (but maybe the other side crashed). | 
|  317       LOG(WARNING) << "RawChannel write error"; |  321       LOG(WARNING) << "RawChannel write error"; | 
|  318       break; |  322       break; | 
|  319   } |  323   } | 
|  320   Shutdown(); |  324   Shutdown(); | 
|  321 } |  325 } | 
|  322  |  326  | 
|  323 void Channel::OnReadMessageForDownstream( |  327 void Channel::OnReadMessageForDownstream( | 
|  324     const MessageInTransit::View& message_view, |  328     const MessageInTransit::View& message_view, | 
|  325     embedder::ScopedPlatformHandleVectorPtr platform_handles) { |  329     embedder::ScopedPlatformHandleVectorPtr platform_handles) { | 
 |  330   DCHECK(creation_thread_checker_.CalledOnValidThread()); | 
|  326   DCHECK(message_view.type() == MessageInTransit::kTypeMessagePipeEndpoint || |  331   DCHECK(message_view.type() == MessageInTransit::kTypeMessagePipeEndpoint || | 
|  327          message_view.type() == MessageInTransit::kTypeMessagePipe); |  332          message_view.type() == MessageInTransit::kTypeMessagePipe); | 
|  328  |  333  | 
|  329   MessageInTransit::EndpointId local_id = message_view.destination_id(); |  334   MessageInTransit::EndpointId local_id = message_view.destination_id(); | 
|  330   if (local_id == MessageInTransit::kInvalidEndpointId) { |  335   if (local_id == MessageInTransit::kInvalidEndpointId) { | 
|  331     HandleRemoteError("Received message with no destination ID"); |  336     HandleRemoteError("Received message with no destination ID"); | 
|  332     return; |  337     return; | 
|  333   } |  338   } | 
|  334  |  339  | 
|  335   ChannelEndpoint::State state = ChannelEndpoint::STATE_NORMAL; |  340   ChannelEndpoint::State state = ChannelEndpoint::STATE_NORMAL; | 
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  395         "Failed to enqueue message to local ID %u (result %d)", |  400         "Failed to enqueue message to local ID %u (result %d)", | 
|  396         static_cast<unsigned>(local_id), |  401         static_cast<unsigned>(local_id), | 
|  397         static_cast<int>(result))); |  402         static_cast<int>(result))); | 
|  398     return; |  403     return; | 
|  399   } |  404   } | 
|  400 } |  405 } | 
|  401  |  406  | 
|  402 void Channel::OnReadMessageForChannel( |  407 void Channel::OnReadMessageForChannel( | 
|  403     const MessageInTransit::View& message_view, |  408     const MessageInTransit::View& message_view, | 
|  404     embedder::ScopedPlatformHandleVectorPtr platform_handles) { |  409     embedder::ScopedPlatformHandleVectorPtr platform_handles) { | 
 |  410   DCHECK(creation_thread_checker_.CalledOnValidThread()); | 
|  405   DCHECK_EQ(message_view.type(), MessageInTransit::kTypeChannel); |  411   DCHECK_EQ(message_view.type(), MessageInTransit::kTypeChannel); | 
|  406  |  412  | 
|  407   // Currently, no channel messages take platform handles. |  413   // Currently, no channel messages take platform handles. | 
|  408   if (platform_handles) { |  414   if (platform_handles) { | 
|  409     HandleRemoteError( |  415     HandleRemoteError( | 
|  410         "Received invalid channel message (has platform handles)"); |  416         "Received invalid channel message (has platform handles)"); | 
|  411     NOTREACHED(); |  417     NOTREACHED(); | 
|  412     return; |  418     return; | 
|  413   } |  419   } | 
|  414  |  420  | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  446     default: |  452     default: | 
|  447       HandleRemoteError("Received invalid channel message"); |  453       HandleRemoteError("Received invalid channel message"); | 
|  448       NOTREACHED(); |  454       NOTREACHED(); | 
|  449       break; |  455       break; | 
|  450   } |  456   } | 
|  451 } |  457 } | 
|  452  |  458  | 
|  453 bool Channel::RemoveMessagePipeEndpoint( |  459 bool Channel::RemoveMessagePipeEndpoint( | 
|  454     MessageInTransit::EndpointId local_id, |  460     MessageInTransit::EndpointId local_id, | 
|  455     MessageInTransit::EndpointId remote_id) { |  461     MessageInTransit::EndpointId remote_id) { | 
 |  462   DCHECK(creation_thread_checker_.CalledOnValidThread()); | 
 |  463  | 
|  456   scoped_refptr<MessagePipe> message_pipe; |  464   scoped_refptr<MessagePipe> message_pipe; | 
|  457   unsigned port; |  465   unsigned port; | 
|  458   { |  466   { | 
|  459     base::AutoLock locker(lock_); |  467     base::AutoLock locker(lock_); | 
|  460  |  468  | 
|  461     IdToEndpointMap::iterator it = local_id_to_endpoint_map_.find(local_id); |  469     IdToEndpointMap::iterator it = local_id_to_endpoint_map_.find(local_id); | 
|  462     if (it == local_id_to_endpoint_map_.end()) { |  470     if (it == local_id_to_endpoint_map_.end()) { | 
|  463       DVLOG(2) << "Remove message pipe error: not found"; |  471       DVLOG(2) << "Remove message pipe error: not found"; | 
|  464       return false; |  472       return false; | 
|  465     } |  473     } | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  519   // TODO(vtl): Is this how we really want to handle this? |  527   // TODO(vtl): Is this how we really want to handle this? | 
|  520   // Sometimes we'll want to propagate the error back to the message pipe |  528   // Sometimes we'll want to propagate the error back to the message pipe | 
|  521   // (endpoint), and notify it that the remote is (effectively) closed. |  529   // (endpoint), and notify it that the remote is (effectively) closed. | 
|  522   // Sometimes we'll want to kill the channel (and notify all the endpoints that |  530   // Sometimes we'll want to kill the channel (and notify all the endpoints that | 
|  523   // their remotes are dead. |  531   // their remotes are dead. | 
|  524   LOG(WARNING) << error_message; |  532   LOG(WARNING) << error_message; | 
|  525 } |  533 } | 
|  526  |  534  | 
|  527 }  // namespace system |  535 }  // namespace system | 
|  528 }  // namespace mojo |  536 }  // namespace mojo | 
| OLD | NEW |