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

Side by Side Diff: ipc/ipc_mojo_bootstrap.cc

Issue 2310563002: Adds routed interface support between RenderFrameHost and RenderFrame (Closed)
Patch Set: nit Created 4 years, 3 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
« no previous file with comments | « ipc/ipc_listener.h ('k') | ipc/message_router.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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "ipc/ipc_mojo_bootstrap.h" 5 #include "ipc/ipc_mojo_bootstrap.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <map> 9 #include <map>
10 #include <memory> 10 #include <memory>
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 bool Accept(mojo::Message* message) override { 595 bool Accept(mojo::Message* message) override {
596 DCHECK(thread_checker_.CalledOnValidThread()); 596 DCHECK(thread_checker_.CalledOnValidThread());
597 597
598 if (mojo::PipeControlMessageHandler::IsPipeControlMessage(message)) 598 if (mojo::PipeControlMessageHandler::IsPipeControlMessage(message))
599 return control_message_handler_.Accept(message); 599 return control_message_handler_.Accept(message);
600 600
601 mojo::InterfaceId id = message->interface_id(); 601 mojo::InterfaceId id = message->interface_id();
602 DCHECK(mojo::IsValidInterfaceId(id)); 602 DCHECK(mojo::IsValidInterfaceId(id));
603 603
604 base::AutoLock locker(lock_); 604 base::AutoLock locker(lock_);
605 Endpoint* endpoint = 605 Endpoint* endpoint = GetEndpointForDispatch(id, true /* create */);
606 GetEndpointForDispatch(id, false /* close_on_insert */);
607 mojo::InterfaceEndpointClient* client = 606 mojo::InterfaceEndpointClient* client =
608 endpoint ? endpoint->client() : nullptr; 607 endpoint ? endpoint->client() : nullptr;
609 if (!client || !endpoint->task_runner()->BelongsToCurrentThread()) { 608 if (!client || !endpoint->task_runner()->BelongsToCurrentThread()) {
610 // No client has been bound yet or the client runs tasks on another 609 // No client has been bound yet or the client runs tasks on another
611 // thread. We assume the other thread must always be the one on which 610 // thread. We assume the other thread must always be the one on which
612 // |proxy_task_runner_| runs tasks, since that's the only valid scenario. 611 // |proxy_task_runner_| runs tasks, since that's the only valid scenario.
613 // 612 //
614 // If the client is not yet bound, it must be bound by the time this task 613 // If the client is not yet bound, it must be bound by the time this task
615 // runs or else it's programmer error. 614 // runs or else it's programmer error.
616 DCHECK(proxy_task_runner_); 615 DCHECK(proxy_task_runner_);
(...skipping 28 matching lines...) Expand all
645 return client->HandleIncomingMessage(message); 644 return client->HandleIncomingMessage(message);
646 } 645 }
647 646
648 void AcceptOnProxyThread(mojo::Message message) { 647 void AcceptOnProxyThread(mojo::Message message) {
649 DCHECK(proxy_task_runner_->BelongsToCurrentThread()); 648 DCHECK(proxy_task_runner_->BelongsToCurrentThread());
650 649
651 mojo::InterfaceId id = message.interface_id(); 650 mojo::InterfaceId id = message.interface_id();
652 DCHECK(mojo::IsValidInterfaceId(id) && !mojo::IsMasterInterfaceId(id)); 651 DCHECK(mojo::IsValidInterfaceId(id) && !mojo::IsMasterInterfaceId(id));
653 652
654 base::AutoLock locker(lock_); 653 base::AutoLock locker(lock_);
655 Endpoint* endpoint = GetEndpointForDispatch(id, true /* close_on_insert */); 654 Endpoint* endpoint = GetEndpointForDispatch(id, false /* create */);
656 if (!endpoint) 655 if (!endpoint)
657 return; 656 return;
658 657
659 mojo::InterfaceEndpointClient* client = endpoint->client(); 658 mojo::InterfaceEndpointClient* client = endpoint->client();
660 if (!client) 659 if (!client)
661 return; 660 return;
662 661
663 DCHECK(endpoint->task_runner()->BelongsToCurrentThread()); 662 DCHECK(endpoint->task_runner()->BelongsToCurrentThread());
664 663
665 // Sync messages should never make their way to this method. 664 // Sync messages should never make their way to this method.
666 DCHECK(!message.has_flag(mojo::Message::kFlagIsSync)); 665 DCHECK(!message.has_flag(mojo::Message::kFlagIsSync));
667 666
668 bool result = false; 667 bool result = false;
669 { 668 {
670 base::AutoUnlock unlocker(lock_); 669 base::AutoUnlock unlocker(lock_);
671 result = client->HandleIncomingMessage(&message); 670 result = client->HandleIncomingMessage(&message);
672 } 671 }
673 672
674 if (!result) 673 if (!result)
675 RaiseError(); 674 RaiseError();
676 } 675 }
677 676
678 void AcceptSyncMessage(mojo::InterfaceId interface_id, uint32_t message_id) { 677 void AcceptSyncMessage(mojo::InterfaceId interface_id, uint32_t message_id) {
679 DCHECK(proxy_task_runner_->BelongsToCurrentThread()); 678 DCHECK(proxy_task_runner_->BelongsToCurrentThread());
680 679
681 base::AutoLock locker(lock_); 680 base::AutoLock locker(lock_);
682 Endpoint* endpoint = 681 Endpoint* endpoint =
683 GetEndpointForDispatch(interface_id, true /* close_on_insert */); 682 GetEndpointForDispatch(interface_id, false /* create */);
684 if (!endpoint) 683 if (!endpoint)
685 return; 684 return;
686 685
687 DCHECK(endpoint->task_runner()->BelongsToCurrentThread()); 686 DCHECK(endpoint->task_runner()->BelongsToCurrentThread());
688 mojo::Message message = endpoint->PopSyncMessage(message_id); 687 mojo::Message message = endpoint->PopSyncMessage(message_id);
689 688
690 // The message must have already been dequeued by the endpoint waking up 689 // The message must have already been dequeued by the endpoint waking up
691 // from a sync wait. Nothing to do. 690 // from a sync wait. Nothing to do.
692 if (message.IsNull()) 691 if (message.IsNull())
693 return; 692 return;
694 693
695 mojo::InterfaceEndpointClient* client = endpoint->client(); 694 mojo::InterfaceEndpointClient* client = endpoint->client();
696 if (!client) 695 if (!client)
697 return; 696 return;
698 697
699 bool result = false; 698 bool result = false;
700 { 699 {
701 base::AutoUnlock unlocker(lock_); 700 base::AutoUnlock unlocker(lock_);
702 result = client->HandleIncomingMessage(&message); 701 result = client->HandleIncomingMessage(&message);
703 } 702 }
704 703
705 if (!result) 704 if (!result)
706 RaiseError(); 705 RaiseError();
707 } 706 }
708 707
709 Endpoint* GetEndpointForDispatch(mojo::InterfaceId id, bool close_on_insert) { 708 Endpoint* GetEndpointForDispatch(mojo::InterfaceId id, bool create) {
710 lock_.AssertAcquired(); 709 lock_.AssertAcquired();
710 auto iter = endpoints_.find(id);
711 if (iter != endpoints_.end())
712 return iter->second.get();
713 if (!create)
714 return nullptr;
711 bool inserted = false; 715 bool inserted = false;
712 Endpoint* endpoint = FindOrInsertEndpoint(id, &inserted); 716 Endpoint* endpoint = FindOrInsertEndpoint(id, &inserted);
713 if (inserted && close_on_insert) { 717 DCHECK(inserted);
714 MarkClosedAndMaybeRemove(endpoint);
715 if (!mojo::IsMasterInterfaceId(id))
716 control_message_proxy_.NotifyPeerEndpointClosed(id);
717 return nullptr;
718 }
719
720 if (endpoint->closed())
721 return nullptr;
722
723 return endpoint; 718 return endpoint;
724 } 719 }
725 720
726 // mojo::PipeControlMessageHandlerDelegate: 721 // mojo::PipeControlMessageHandlerDelegate:
727 bool OnPeerAssociatedEndpointClosed(mojo::InterfaceId id) override { 722 bool OnPeerAssociatedEndpointClosed(mojo::InterfaceId id) override {
728 DCHECK(thread_checker_.CalledOnValidThread()); 723 DCHECK(thread_checker_.CalledOnValidThread());
729 724
730 if (mojo::IsMasterInterfaceId(id)) 725 if (mojo::IsMasterInterfaceId(id))
731 return false; 726 return false;
732 727
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 Channel::Mode mode, 843 Channel::Mode mode,
849 Delegate* delegate, 844 Delegate* delegate,
850 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) { 845 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) {
851 return base::MakeUnique<MojoBootstrapImpl>( 846 return base::MakeUnique<MojoBootstrapImpl>(
852 std::move(handle), delegate, 847 std::move(handle), delegate,
853 new ChannelAssociatedGroupController(mode == Channel::MODE_SERVER, 848 new ChannelAssociatedGroupController(mode == Channel::MODE_SERVER,
854 ipc_task_runner)); 849 ipc_task_runner));
855 } 850 }
856 851
857 } // namespace IPC 852 } // namespace IPC
OLDNEW
« no previous file with comments | « ipc/ipc_listener.h ('k') | ipc/message_router.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698