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 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 base::AutoLock locker_(lock_); | 239 base::AutoLock locker_(lock_); |
240 if (!is_running_) | 240 if (!is_running_) |
241 return; | 241 return; |
242 | 242 |
243 IdToEndpointMap::iterator it = local_id_to_endpoint_map_.find(local_id); | 243 IdToEndpointMap::iterator it = local_id_to_endpoint_map_.find(local_id); |
244 DCHECK(it != local_id_to_endpoint_map_.end()); | 244 DCHECK(it != local_id_to_endpoint_map_.end()); |
245 | 245 |
246 switch (it->second->state_) { | 246 switch (it->second->state_) { |
247 case ChannelEndpoint::STATE_NORMAL: | 247 case ChannelEndpoint::STATE_NORMAL: |
248 it->second->state_ = ChannelEndpoint::STATE_WAIT_REMOTE_REMOVE_ACK; | 248 it->second->state_ = ChannelEndpoint::STATE_WAIT_REMOTE_REMOVE_ACK; |
249 it->second->message_pipe_ = NULL; | 249 it->second->message_pipe_ = nullptr; |
250 if (remote_id == MessageInTransit::kInvalidEndpointId) | 250 if (remote_id == MessageInTransit::kInvalidEndpointId) |
251 return; | 251 return; |
252 // We have to send a remove message (outside the lock). | 252 // We have to send a remove message (outside the lock). |
253 break; | 253 break; |
254 case ChannelEndpoint::STATE_WAIT_LOCAL_DETACH: | 254 case ChannelEndpoint::STATE_WAIT_LOCAL_DETACH: |
255 endpoint_to_detach = it->second; | 255 endpoint_to_detach = it->second; |
256 local_id_to_endpoint_map_.erase(it); | 256 local_id_to_endpoint_map_.erase(it); |
257 // We have to detach (outside the lock). | 257 // We have to detach (outside the lock). |
258 break; | 258 break; |
259 case ChannelEndpoint::STATE_WAIT_REMOTE_REMOVE_ACK: | 259 case ChannelEndpoint::STATE_WAIT_REMOTE_REMOVE_ACK: |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 if (it == local_id_to_endpoint_map_.end()) { | 488 if (it == local_id_to_endpoint_map_.end()) { |
489 DVLOG(2) << "Remove message pipe error: not found"; | 489 DVLOG(2) << "Remove message pipe error: not found"; |
490 return false; | 490 return false; |
491 } | 491 } |
492 | 492 |
493 switch (it->second->state_) { | 493 switch (it->second->state_) { |
494 case ChannelEndpoint::STATE_NORMAL: | 494 case ChannelEndpoint::STATE_NORMAL: |
495 it->second->state_ = ChannelEndpoint::STATE_WAIT_LOCAL_DETACH; | 495 it->second->state_ = ChannelEndpoint::STATE_WAIT_LOCAL_DETACH; |
496 message_pipe = it->second->message_pipe_; | 496 message_pipe = it->second->message_pipe_; |
497 port = it->second->port_; | 497 port = it->second->port_; |
498 it->second->message_pipe_ = NULL; | 498 it->second->message_pipe_ = nullptr; |
499 // We have to send a remove ack message (outside the lock). | 499 // We have to send a remove ack message (outside the lock). |
500 break; | 500 break; |
501 case ChannelEndpoint::STATE_WAIT_LOCAL_DETACH: | 501 case ChannelEndpoint::STATE_WAIT_LOCAL_DETACH: |
502 DVLOG(2) << "Remove message pipe error: wrong state"; | 502 DVLOG(2) << "Remove message pipe error: wrong state"; |
503 return false; | 503 return false; |
504 case ChannelEndpoint::STATE_WAIT_REMOTE_REMOVE_ACK: | 504 case ChannelEndpoint::STATE_WAIT_REMOTE_REMOVE_ACK: |
505 endpoint_to_detach = it->second; | 505 endpoint_to_detach = it->second; |
506 local_id_to_endpoint_map_.erase(it); | 506 local_id_to_endpoint_map_.erase(it); |
507 // We have to detach (outside the lock). | 507 // We have to detach (outside the lock). |
508 break; | 508 break; |
(...skipping 18 matching lines...) Expand all Loading... |
527 message_pipe->OnRemove(port); | 527 message_pipe->OnRemove(port); |
528 | 528 |
529 return true; | 529 return true; |
530 } | 530 } |
531 | 531 |
532 bool Channel::SendControlMessage(MessageInTransit::Subtype subtype, | 532 bool Channel::SendControlMessage(MessageInTransit::Subtype subtype, |
533 MessageInTransit::EndpointId local_id, | 533 MessageInTransit::EndpointId local_id, |
534 MessageInTransit::EndpointId remote_id) { | 534 MessageInTransit::EndpointId remote_id) { |
535 DVLOG(2) << "Sending channel control message: subtype " << subtype | 535 DVLOG(2) << "Sending channel control message: subtype " << subtype |
536 << ", local ID " << local_id << ", remote ID " << remote_id; | 536 << ", local ID " << local_id << ", remote ID " << remote_id; |
537 scoped_ptr<MessageInTransit> message( | 537 scoped_ptr<MessageInTransit> message(new MessageInTransit( |
538 new MessageInTransit(MessageInTransit::kTypeChannel, subtype, 0, NULL)); | 538 MessageInTransit::kTypeChannel, subtype, 0, nullptr)); |
539 message->set_source_id(local_id); | 539 message->set_source_id(local_id); |
540 message->set_destination_id(remote_id); | 540 message->set_destination_id(remote_id); |
541 return WriteMessage(message.Pass()); | 541 return WriteMessage(message.Pass()); |
542 } | 542 } |
543 | 543 |
544 void Channel::HandleRemoteError(const base::StringPiece& error_message) { | 544 void Channel::HandleRemoteError(const base::StringPiece& error_message) { |
545 // TODO(vtl): Is this how we really want to handle this? Probably we want to | 545 // TODO(vtl): Is this how we really want to handle this? Probably we want to |
546 // terminate the connection, since it's spewing invalid stuff. | 546 // terminate the connection, since it's spewing invalid stuff. |
547 LOG(WARNING) << error_message; | 547 LOG(WARNING) << error_message; |
548 } | 548 } |
549 | 549 |
550 void Channel::HandleLocalError(const base::StringPiece& error_message) { | 550 void Channel::HandleLocalError(const base::StringPiece& error_message) { |
551 // TODO(vtl): Is this how we really want to handle this? | 551 // TODO(vtl): Is this how we really want to handle this? |
552 // Sometimes we'll want to propagate the error back to the message pipe | 552 // Sometimes we'll want to propagate the error back to the message pipe |
553 // (endpoint), and notify it that the remote is (effectively) closed. | 553 // (endpoint), and notify it that the remote is (effectively) closed. |
554 // Sometimes we'll want to kill the channel (and notify all the endpoints that | 554 // Sometimes we'll want to kill the channel (and notify all the endpoints that |
555 // their remotes are dead. | 555 // their remotes are dead. |
556 LOG(WARNING) << error_message; | 556 LOG(WARNING) << error_message; |
557 } | 557 } |
558 | 558 |
559 } // namespace system | 559 } // namespace system |
560 } // namespace mojo | 560 } // namespace mojo |
OLD | NEW |