Index: mojo/public/cpp/bindings/lib/multiplex_router.cc |
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.cc b/mojo/public/cpp/bindings/lib/multiplex_router.cc |
index 4e888afba42873e211b7d22e9b74d0434194bbaa..d2520f780c9206add2187b03d14b376081843d3f 100644 |
--- a/mojo/public/cpp/bindings/lib/multiplex_router.cc |
+++ b/mojo/public/cpp/bindings/lib/multiplex_router.cc |
@@ -18,6 +18,7 @@ |
#include "mojo/public/cpp/bindings/associated_group.h" |
#include "mojo/public/cpp/bindings/interface_endpoint_client.h" |
#include "mojo/public/cpp/bindings/interface_endpoint_controller.h" |
+#include "mojo/public/cpp/bindings/lib/may_auto_lock.h" |
#include "mojo/public/cpp/bindings/sync_handle_watcher.h" |
namespace mojo { |
@@ -50,13 +51,13 @@ class MultiplexRouter::InterfaceEndpoint |
bool closed() const { return closed_; } |
void set_closed() { |
- router_->lock_.AssertAcquired(); |
+ router_->AssertLockAcquired(); |
closed_ = true; |
} |
bool peer_closed() const { return peer_closed_; } |
void set_peer_closed() { |
- router_->lock_.AssertAcquired(); |
+ router_->AssertLockAcquired(); |
peer_closed_ = true; |
} |
@@ -68,7 +69,7 @@ class MultiplexRouter::InterfaceEndpoint |
void AttachClient(InterfaceEndpointClient* client, |
scoped_refptr<base::SingleThreadTaskRunner> runner) { |
- router_->lock_.AssertAcquired(); |
+ router_->AssertLockAcquired(); |
DCHECK(!client_); |
DCHECK(!closed_); |
DCHECK(runner->BelongsToCurrentThread()); |
@@ -80,7 +81,7 @@ class MultiplexRouter::InterfaceEndpoint |
// This method must be called on the same thread as the corresponding |
// AttachClient() call. |
void DetachClient() { |
- router_->lock_.AssertAcquired(); |
+ router_->AssertLockAcquired(); |
DCHECK(client_); |
DCHECK(task_runner_->BelongsToCurrentThread()); |
DCHECK(!closed_); |
@@ -91,7 +92,7 @@ class MultiplexRouter::InterfaceEndpoint |
} |
void SignalSyncMessageEvent() { |
- router_->lock_.AssertAcquired(); |
+ router_->AssertLockAcquired(); |
if (event_signalled_) |
return; |
@@ -104,7 +105,7 @@ class MultiplexRouter::InterfaceEndpoint |
} |
void ResetSyncMessageSignal() { |
- router_->lock_.AssertAcquired(); |
+ router_->AssertLockAcquired(); |
if (!event_signalled_) |
return; |
@@ -146,7 +147,7 @@ class MultiplexRouter::InterfaceEndpoint |
friend class base::RefCounted<InterfaceEndpoint>; |
~InterfaceEndpoint() override { |
- router_->lock_.AssertAcquired(); |
+ router_->AssertLockAcquired(); |
DCHECK(!client_); |
DCHECK(closed_); |
@@ -164,7 +165,7 @@ class MultiplexRouter::InterfaceEndpoint |
DCHECK_EQ(MOJO_RESULT_OK, result); |
bool reset_sync_watcher = false; |
{ |
- base::AutoLock locker(router_->lock_); |
+ MayAutoLock locker(router_->lock_.get()); |
bool more_to_process = router_->ProcessFirstSyncMessageForEndpoint(id_); |
@@ -189,7 +190,7 @@ class MultiplexRouter::InterfaceEndpoint |
return; |
{ |
- base::AutoLock locker(router_->lock_); |
+ MayAutoLock locker(router_->lock_.get()); |
EnsureEventMessagePipeExists(); |
auto iter = router_->sync_message_tasks_.find(id_); |
@@ -203,7 +204,7 @@ class MultiplexRouter::InterfaceEndpoint |
} |
void EnsureEventMessagePipeExists() { |
- router_->lock_.AssertAcquired(); |
+ router_->AssertLockAcquired(); |
if (sync_message_event_receiver_.is_valid()) |
return; |
@@ -281,16 +282,19 @@ struct MultiplexRouter::Task { |
}; |
MultiplexRouter::MultiplexRouter( |
- bool set_interface_id_namesapce_bit, |
ScopedMessagePipeHandle message_pipe, |
+ Config config, |
+ bool set_interface_id_namesapce_bit, |
scoped_refptr<base::SingleThreadTaskRunner> runner) |
: set_interface_id_namespace_bit_(set_interface_id_namesapce_bit), |
task_runner_(runner), |
header_validator_(nullptr), |
filters_(this), |
connector_(std::move(message_pipe), |
- Connector::MULTI_THREADED_SEND, |
+ config == SINGLE_INTERFACE ? Connector::SINGLE_THREADED_SEND |
+ : Connector::MULTI_THREADED_SEND, |
std::move(runner)), |
+ lock_(config == SINGLE_INTERFACE ? nullptr : new base::Lock), |
control_message_handler_(this), |
control_message_proxy_(&connector_), |
next_interface_id_value_(1), |
@@ -315,7 +319,7 @@ MultiplexRouter::MultiplexRouter( |
} |
MultiplexRouter::~MultiplexRouter() { |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
sync_message_tasks_.clear(); |
tasks_.clear(); |
@@ -343,7 +347,7 @@ void MultiplexRouter::SetMasterInterfaceName(const std::string& name) { |
void MultiplexRouter::CreateEndpointHandlePair( |
ScopedInterfaceEndpointHandle* local_endpoint, |
ScopedInterfaceEndpointHandle* remote_endpoint) { |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
uint32_t id = 0; |
do { |
if (next_interface_id_value_ >= kInterfaceIdNamespaceMask) |
@@ -367,7 +371,7 @@ ScopedInterfaceEndpointHandle MultiplexRouter::CreateLocalEndpointHandle( |
if (!IsValidInterfaceId(id)) |
return ScopedInterfaceEndpointHandle(); |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
bool inserted = false; |
InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, &inserted); |
if (inserted) { |
@@ -386,7 +390,7 @@ void MultiplexRouter::CloseEndpointHandle(InterfaceId id, bool is_local) { |
if (!IsValidInterfaceId(id)) |
return; |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
if (!is_local) { |
DCHECK(base::ContainsKey(endpoints_, id)); |
@@ -419,7 +423,7 @@ InterfaceEndpointController* MultiplexRouter::AttachEndpointClient( |
DCHECK(IsValidInterfaceId(id)); |
DCHECK(client); |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
DCHECK(base::ContainsKey(endpoints_, id)); |
InterfaceEndpoint* endpoint = endpoints_[id].get(); |
@@ -438,7 +442,7 @@ void MultiplexRouter::DetachEndpointClient( |
DCHECK(IsValidInterfaceId(id)); |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
DCHECK(base::ContainsKey(endpoints_, id)); |
InterfaceEndpoint* endpoint = endpoints_[id].get(); |
@@ -467,7 +471,7 @@ void MultiplexRouter::PauseIncomingMethodCallProcessing() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
connector_.PauseIncomingMethodCallProcessing(); |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
paused_ = true; |
for (auto iter = endpoints_.begin(); iter != endpoints_.end(); ++iter) |
@@ -478,7 +482,7 @@ void MultiplexRouter::ResumeIncomingMethodCallProcessing() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
connector_.ResumeIncomingMethodCallProcessing(); |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
paused_ = false; |
for (auto iter = endpoints_.begin(); iter != endpoints_.end(); ++iter) { |
@@ -492,7 +496,7 @@ void MultiplexRouter::ResumeIncomingMethodCallProcessing() { |
bool MultiplexRouter::HasAssociatedEndpoints() const { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
if (endpoints_.size() > 1) |
return true; |
@@ -504,7 +508,7 @@ bool MultiplexRouter::HasAssociatedEndpoints() const { |
void MultiplexRouter::EnableTestingMode() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
testing_mode_ = true; |
connector_.set_enforce_errors_from_incoming_receiver(false); |
@@ -514,7 +518,7 @@ bool MultiplexRouter::Accept(Message* message) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
scoped_refptr<MultiplexRouter> protector(this); |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
DCHECK(!paused_); |
@@ -553,7 +557,7 @@ bool MultiplexRouter::Accept(Message* message) { |
} |
bool MultiplexRouter::OnPeerAssociatedEndpointClosed(InterfaceId id) { |
- lock_.AssertAcquired(); |
+ AssertLockAcquired(); |
if (IsMasterInterfaceId(id)) |
return false; |
@@ -578,7 +582,7 @@ bool MultiplexRouter::OnPeerAssociatedEndpointClosed(InterfaceId id) { |
} |
bool MultiplexRouter::OnAssociatedEndpointClosedBeforeSent(InterfaceId id) { |
- lock_.AssertAcquired(); |
+ AssertLockAcquired(); |
if (IsMasterInterfaceId(id)) |
return false; |
@@ -596,7 +600,7 @@ void MultiplexRouter::OnPipeConnectionError() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
scoped_refptr<MultiplexRouter> protector(this); |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
encountered_error_ = true; |
@@ -621,7 +625,7 @@ void MultiplexRouter::OnPipeConnectionError() { |
void MultiplexRouter::ProcessTasks( |
ClientCallBehavior client_call_behavior, |
base::SingleThreadTaskRunner* current_task_runner) { |
- lock_.AssertAcquired(); |
+ AssertLockAcquired(); |
if (posted_to_process_tasks_) |
return; |
@@ -665,7 +669,7 @@ void MultiplexRouter::ProcessTasks( |
} |
bool MultiplexRouter::ProcessFirstSyncMessageForEndpoint(InterfaceId id) { |
- lock_.AssertAcquired(); |
+ AssertLockAcquired(); |
auto iter = sync_message_tasks_.find(id); |
if (iter == sync_message_tasks_.end()) |
@@ -704,7 +708,7 @@ bool MultiplexRouter::ProcessNotifyErrorTask( |
DCHECK(!current_task_runner || current_task_runner->BelongsToCurrentThread()); |
DCHECK(!paused_); |
- lock_.AssertAcquired(); |
+ AssertLockAcquired(); |
InterfaceEndpoint* endpoint = task->endpoint_to_notify.get(); |
if (!endpoint->client()) |
return true; |
@@ -724,7 +728,7 @@ bool MultiplexRouter::ProcessNotifyErrorTask( |
// |
// It is safe to call into |client| without the lock. Because |client| is |
// always accessed on the same thread, including DetachEndpointClient(). |
- base::AutoUnlock unlocker(lock_); |
+ MayAutoUnlock unlocker(lock_.get()); |
client->NotifyError(); |
} |
return true; |
@@ -737,7 +741,7 @@ bool MultiplexRouter::ProcessIncomingMessage( |
DCHECK(!current_task_runner || current_task_runner->BelongsToCurrentThread()); |
DCHECK(!paused_); |
DCHECK(message); |
- lock_.AssertAcquired(); |
+ AssertLockAcquired(); |
if (message->IsNull()) { |
// This is a sync message and has been processed during sync handle |
@@ -811,7 +815,7 @@ bool MultiplexRouter::ProcessIncomingMessage( |
// |
// It is safe to call into |client| without the lock. Because |client| is |
// always accessed on the same thread, including DetachEndpointClient(). |
- base::AutoUnlock unlocker(lock_); |
+ MayAutoUnlock unlocker(lock_.get()); |
result = client->HandleIncomingMessage(message); |
} |
if (!result) |
@@ -822,7 +826,7 @@ bool MultiplexRouter::ProcessIncomingMessage( |
void MultiplexRouter::MaybePostToProcessTasks( |
base::SingleThreadTaskRunner* task_runner) { |
- lock_.AssertAcquired(); |
+ AssertLockAcquired(); |
if (posted_to_process_tasks_) |
return; |
@@ -835,7 +839,7 @@ void MultiplexRouter::MaybePostToProcessTasks( |
void MultiplexRouter::LockAndCallProcessTasks() { |
// There is no need to hold a ref to this class in this case because this is |
// always called using base::Bind(), which holds a ref. |
- base::AutoLock locker(lock_); |
+ MayAutoLock locker(lock_.get()); |
posted_to_process_tasks_ = false; |
scoped_refptr<base::SingleThreadTaskRunner> runner( |
std::move(posted_to_task_runner_)); |
@@ -861,7 +865,7 @@ void MultiplexRouter::UpdateEndpointStateMayRemove( |
} |
void MultiplexRouter::RaiseErrorInNonTestingMode() { |
- lock_.AssertAcquired(); |
+ AssertLockAcquired(); |
if (!testing_mode_) |
RaiseError(); |
} |
@@ -869,7 +873,7 @@ void MultiplexRouter::RaiseErrorInNonTestingMode() { |
MultiplexRouter::InterfaceEndpoint* MultiplexRouter::FindOrInsertEndpoint( |
InterfaceId id, |
bool* inserted) { |
- lock_.AssertAcquired(); |
+ AssertLockAcquired(); |
// Either |inserted| is nullptr or it points to a boolean initialized as |
// false. |
DCHECK(!inserted || !*inserted); |
@@ -888,5 +892,12 @@ MultiplexRouter::InterfaceEndpoint* MultiplexRouter::FindOrInsertEndpoint( |
return endpoint; |
} |
+void MultiplexRouter::AssertLockAcquired() { |
+#if DCHECK_IS_ON() |
+ if (lock_) |
+ lock_->AssertAcquired(); |
+#endif |
+} |
+ |
} // namespace internal |
} // namespace mojo |