OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/public/cpp/bindings/lib/multiplex_router.h" | 5 #include "mojo/public/cpp/bindings/lib/multiplex_router.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 if (!IsValidInterfaceId(id)) | 395 if (!IsValidInterfaceId(id)) |
396 return; | 396 return; |
397 | 397 |
398 MayAutoLock locker(lock_.get()); | 398 MayAutoLock locker(lock_.get()); |
399 | 399 |
400 if (!is_local) { | 400 if (!is_local) { |
401 DCHECK(base::ContainsKey(endpoints_, id)); | 401 DCHECK(base::ContainsKey(endpoints_, id)); |
402 DCHECK(!IsMasterInterfaceId(id)); | 402 DCHECK(!IsMasterInterfaceId(id)); |
403 | 403 |
404 // We will receive a NotifyPeerEndpointClosed message from the other side. | 404 // We will receive a NotifyPeerEndpointClosed message from the other side. |
| 405 MayAutoUnlock unlocker(lock_.get()); |
405 control_message_proxy_.NotifyEndpointClosedBeforeSent(id); | 406 control_message_proxy_.NotifyEndpointClosedBeforeSent(id); |
406 | 407 |
407 return; | 408 return; |
408 } | 409 } |
409 | 410 |
410 DCHECK(base::ContainsKey(endpoints_, id)); | 411 DCHECK(base::ContainsKey(endpoints_, id)); |
411 InterfaceEndpoint* endpoint = endpoints_[id].get(); | 412 InterfaceEndpoint* endpoint = endpoints_[id].get(); |
412 DCHECK(!endpoint->client()); | 413 DCHECK(!endpoint->client()); |
413 DCHECK(!endpoint->closed()); | 414 DCHECK(!endpoint->closed()); |
414 UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED); | 415 UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED); |
415 | 416 |
416 if (!IsMasterInterfaceId(id)) | 417 if (!IsMasterInterfaceId(id)) { |
| 418 MayAutoUnlock unlocker(lock_.get()); |
417 control_message_proxy_.NotifyPeerEndpointClosed(id); | 419 control_message_proxy_.NotifyPeerEndpointClosed(id); |
| 420 } |
418 | 421 |
419 ProcessTasks(NO_DIRECT_CLIENT_CALLS, nullptr); | 422 ProcessTasks(NO_DIRECT_CLIENT_CALLS, nullptr); |
420 } | 423 } |
421 | 424 |
422 InterfaceEndpointController* MultiplexRouter::AttachEndpointClient( | 425 InterfaceEndpointController* MultiplexRouter::AttachEndpointClient( |
423 const ScopedInterfaceEndpointHandle& handle, | 426 const ScopedInterfaceEndpointHandle& handle, |
424 InterfaceEndpointClient* client, | 427 InterfaceEndpointClient* client, |
425 scoped_refptr<base::SingleThreadTaskRunner> runner) { | 428 scoped_refptr<base::SingleThreadTaskRunner> runner) { |
426 const InterfaceId id = handle.id(); | 429 const InterfaceId id = handle.id(); |
427 | 430 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 bool MultiplexRouter::OnAssociatedEndpointClosedBeforeSent(InterfaceId id) { | 592 bool MultiplexRouter::OnAssociatedEndpointClosedBeforeSent(InterfaceId id) { |
590 AssertLockAcquired(); | 593 AssertLockAcquired(); |
591 | 594 |
592 if (IsMasterInterfaceId(id)) | 595 if (IsMasterInterfaceId(id)) |
593 return false; | 596 return false; |
594 | 597 |
595 InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, nullptr); | 598 InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, nullptr); |
596 DCHECK(!endpoint->closed()); | 599 DCHECK(!endpoint->closed()); |
597 UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED); | 600 UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED); |
598 | 601 |
| 602 MayAutoUnlock unlocker(lock_.get()); |
599 control_message_proxy_.NotifyPeerEndpointClosed(id); | 603 control_message_proxy_.NotifyPeerEndpointClosed(id); |
600 | 604 |
601 return true; | 605 return true; |
602 } | 606 } |
603 | 607 |
604 void MultiplexRouter::OnPipeConnectionError() { | 608 void MultiplexRouter::OnPipeConnectionError() { |
605 DCHECK(thread_checker_.CalledOnValidThread()); | 609 DCHECK(thread_checker_.CalledOnValidThread()); |
606 | 610 |
607 scoped_refptr<MultiplexRouter> protector(this); | 611 scoped_refptr<MultiplexRouter> protector(this); |
608 MayAutoLock locker(lock_.get()); | 612 MayAutoLock locker(lock_.get()); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED); | 778 UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED); |
775 | 779 |
776 // It is also possible that this newly-inserted endpoint is the master | 780 // It is also possible that this newly-inserted endpoint is the master |
777 // endpoint. When the master InterfacePtr/Binding goes away, the message | 781 // endpoint. When the master InterfacePtr/Binding goes away, the message |
778 // pipe is closed and we explicitly trigger a pipe connection error. The | 782 // pipe is closed and we explicitly trigger a pipe connection error. The |
779 // error updates all the endpoints, including the master endpoint, with | 783 // error updates all the endpoints, including the master endpoint, with |
780 // PEER_ENDPOINT_CLOSED and removes the master endpoint from the | 784 // PEER_ENDPOINT_CLOSED and removes the master endpoint from the |
781 // registration. We continue to process remaining tasks in the queue, as | 785 // registration. We continue to process remaining tasks in the queue, as |
782 // long as there are refs keeping the router alive. If there are remaining | 786 // long as there are refs keeping the router alive. If there are remaining |
783 // messages for the master endpoint, we will get here. | 787 // messages for the master endpoint, we will get here. |
| 788 MayAutoUnlock unlocker(lock_.get()); |
784 if (!IsMasterInterfaceId(id)) | 789 if (!IsMasterInterfaceId(id)) |
785 control_message_proxy_.NotifyPeerEndpointClosed(id); | 790 control_message_proxy_.NotifyPeerEndpointClosed(id); |
786 return true; | 791 return true; |
787 } | 792 } |
788 | 793 |
789 if (endpoint->closed()) | 794 if (endpoint->closed()) |
790 return true; | 795 return true; |
791 | 796 |
792 if (!endpoint->client()) { | 797 if (!endpoint->client()) { |
793 // We need to wait until a client is attached in order to dispatch further | 798 // We need to wait until a client is attached in order to dispatch further |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
899 | 904 |
900 void MultiplexRouter::AssertLockAcquired() { | 905 void MultiplexRouter::AssertLockAcquired() { |
901 #if DCHECK_IS_ON() | 906 #if DCHECK_IS_ON() |
902 if (lock_) | 907 if (lock_) |
903 lock_->AssertAcquired(); | 908 lock_->AssertAcquired(); |
904 #endif | 909 #endif |
905 } | 910 } |
906 | 911 |
907 } // namespace internal | 912 } // namespace internal |
908 } // namespace mojo | 913 } // namespace mojo |
OLD | NEW |