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

Side by Side Diff: ipc/ipc_mojo_bootstrap.cc

Issue 2494483003: Mojo Bindings: Fix lock-order inversion in associated controllers (Closed)
Patch Set: . Created 4 years, 1 month 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 | « build/sanitizers/tsan_suppressions.cc ('k') | mojo/public/cpp/bindings/lib/multiplex_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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 } 162 }
163 163
164 void CloseEndpointHandle(mojo::InterfaceId id, bool is_local) override { 164 void CloseEndpointHandle(mojo::InterfaceId id, bool is_local) override {
165 if (!mojo::IsValidInterfaceId(id)) 165 if (!mojo::IsValidInterfaceId(id))
166 return; 166 return;
167 167
168 base::AutoLock locker(lock_); 168 base::AutoLock locker(lock_);
169 if (!is_local) { 169 if (!is_local) {
170 DCHECK(ContainsKey(endpoints_, id)); 170 DCHECK(ContainsKey(endpoints_, id));
171 DCHECK(!mojo::IsMasterInterfaceId(id)); 171 DCHECK(!mojo::IsMasterInterfaceId(id));
172
173 base::AutoUnlock unlocker(lock_);
172 control_message_proxy_.NotifyEndpointClosedBeforeSent(id); 174 control_message_proxy_.NotifyEndpointClosedBeforeSent(id);
173 return; 175 return;
174 } 176 }
175 177
176 DCHECK(ContainsKey(endpoints_, id)); 178 DCHECK(ContainsKey(endpoints_, id));
177 Endpoint* endpoint = endpoints_[id].get(); 179 Endpoint* endpoint = endpoints_[id].get();
178 DCHECK(!endpoint->client()); 180 DCHECK(!endpoint->client());
179 DCHECK(!endpoint->closed()); 181 DCHECK(!endpoint->closed());
180 MarkClosedAndMaybeRemove(endpoint); 182 MarkClosedAndMaybeRemove(endpoint);
181 183
184 base::AutoUnlock unlocker(lock_);
182 if (!mojo::IsMasterInterfaceId(id)) 185 if (!mojo::IsMasterInterfaceId(id))
183 control_message_proxy_.NotifyPeerEndpointClosed(id); 186 control_message_proxy_.NotifyPeerEndpointClosed(id);
184 } 187 }
185 188
186 mojo::InterfaceEndpointController* AttachEndpointClient( 189 mojo::InterfaceEndpointController* AttachEndpointClient(
187 const mojo::ScopedInterfaceEndpointHandle& handle, 190 const mojo::ScopedInterfaceEndpointHandle& handle,
188 mojo::InterfaceEndpointClient* client, 191 mojo::InterfaceEndpointClient* client,
189 scoped_refptr<base::SingleThreadTaskRunner> runner) override { 192 scoped_refptr<base::SingleThreadTaskRunner> runner) override {
190 const mojo::InterfaceId id = handle.id(); 193 const mojo::InterfaceId id = handle.id();
191 194
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 738
736 return true; 739 return true;
737 } 740 }
738 741
739 bool OnAssociatedEndpointClosedBeforeSent(mojo::InterfaceId id) override { 742 bool OnAssociatedEndpointClosedBeforeSent(mojo::InterfaceId id) override {
740 DCHECK(thread_checker_.CalledOnValidThread()); 743 DCHECK(thread_checker_.CalledOnValidThread());
741 744
742 if (mojo::IsMasterInterfaceId(id)) 745 if (mojo::IsMasterInterfaceId(id))
743 return false; 746 return false;
744 747
745 base::AutoLock locker(lock_); 748 {
746 Endpoint* endpoint = FindOrInsertEndpoint(id, nullptr); 749 base::AutoLock locker(lock_);
747 DCHECK(!endpoint->closed()); 750 Endpoint* endpoint = FindOrInsertEndpoint(id, nullptr);
748 MarkClosedAndMaybeRemove(endpoint); 751 DCHECK(!endpoint->closed());
752 MarkClosedAndMaybeRemove(endpoint);
753 }
754
749 control_message_proxy_.NotifyPeerEndpointClosed(id); 755 control_message_proxy_.NotifyPeerEndpointClosed(id);
750 return true; 756 return true;
751 } 757 }
752 758
753 // Checked in places which must be run on the master endpoint's thread. 759 // Checked in places which must be run on the master endpoint's thread.
754 base::ThreadChecker thread_checker_; 760 base::ThreadChecker thread_checker_;
755 761
756 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 762 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
757 763
758 scoped_refptr<base::SingleThreadTaskRunner> proxy_task_runner_; 764 scoped_refptr<base::SingleThreadTaskRunner> proxy_task_runner_;
759 const bool set_interface_id_namespace_bit_; 765 const bool set_interface_id_namespace_bit_;
760 bool paused_ = false; 766 bool paused_ = false;
761 std::unique_ptr<mojo::Connector> connector_; 767 std::unique_ptr<mojo::Connector> connector_;
762 mojo::FilterChain filters_; 768 mojo::FilterChain filters_;
763 mojo::PipeControlMessageHandler control_message_handler_; 769 mojo::PipeControlMessageHandler control_message_handler_;
764 ControlMessageProxyThunk control_message_proxy_thunk_; 770 ControlMessageProxyThunk control_message_proxy_thunk_;
771
772 // NOTE: It is unsafe to call into this object while holding |lock_|.
765 mojo::PipeControlMessageProxy control_message_proxy_; 773 mojo::PipeControlMessageProxy control_message_proxy_;
766 774
767 // Outgoing messages that were sent before this controller was bound to a 775 // Outgoing messages that were sent before this controller was bound to a
768 // real message pipe. 776 // real message pipe.
769 std::vector<mojo::Message> outgoing_messages_; 777 std::vector<mojo::Message> outgoing_messages_;
770 778
771 // Guards the fields below for thread-safe access. 779 // Guards the fields below for thread-safe access.
772 base::Lock lock_; 780 base::Lock lock_;
773 781
774 bool encountered_error_ = false; 782 bool encountered_error_ = false;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 Channel::Mode mode, 850 Channel::Mode mode,
843 Delegate* delegate, 851 Delegate* delegate,
844 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) { 852 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) {
845 return base::MakeUnique<MojoBootstrapImpl>( 853 return base::MakeUnique<MojoBootstrapImpl>(
846 std::move(handle), delegate, 854 std::move(handle), delegate,
847 new ChannelAssociatedGroupController(mode == Channel::MODE_SERVER, 855 new ChannelAssociatedGroupController(mode == Channel::MODE_SERVER,
848 ipc_task_runner)); 856 ipc_task_runner));
849 } 857 }
850 858
851 } // namespace IPC 859 } // namespace IPC
OLDNEW
« no previous file with comments | « build/sanitizers/tsan_suppressions.cc ('k') | mojo/public/cpp/bindings/lib/multiplex_router.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698