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 e188c4b4cddb6845b90d096dcc9746dcea3635e0..63f120bb7524d2d3e077689b18ba84108b510a4e 100644 |
--- a/mojo/public/cpp/bindings/lib/multiplex_router.cc |
+++ b/mojo/public/cpp/bindings/lib/multiplex_router.cc |
@@ -141,7 +141,6 @@ class MultiplexRouter::InterfaceEndpoint |
bool SendMessage(Message* message) override { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- message->SerializeAssociatedEndpointHandles(router_); |
message->set_interface_id(id_); |
return router_->connector_.Accept(message); |
} |
@@ -400,8 +399,7 @@ MultiplexRouter::~MultiplexRouter() { |
if (!endpoint->closed()) { |
// This happens when a NotifyPeerEndpointClosed message been received, but |
- // (1) the interface ID hasn't been used to create local endpoint handle; |
- // and (2) a NotifyEndpointClosedBeforeSent hasn't been received. |
+ // the interface ID hasn't been used to create local endpoint handle. |
DCHECK(!endpoint->client()); |
DCHECK(endpoint->peer_closed()); |
UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED); |
@@ -422,27 +420,43 @@ void MultiplexRouter::SetMasterInterfaceName(const char* name) { |
connector_.SetWatcherHeapProfilerTag(name); |
} |
-void MultiplexRouter::CreateEndpointHandlePair( |
- ScopedInterfaceEndpointHandle* local_endpoint, |
- ScopedInterfaceEndpointHandle* remote_endpoint) { |
- MayAutoLock locker(lock_.get()); |
+InterfaceId MultiplexRouter::AssociateInterface( |
+ ScopedInterfaceEndpointHandle handle_to_send) { |
+ if (!handle_to_send.pending_association()) |
+ return kInvalidInterfaceId; |
+ |
uint32_t id = 0; |
- do { |
- if (next_interface_id_value_ >= kInterfaceIdNamespaceMask) |
- next_interface_id_value_ = 1; |
- id = next_interface_id_value_++; |
- if (set_interface_id_namespace_bit_) |
- id |= kInterfaceIdNamespaceMask; |
- } while (base::ContainsKey(endpoints_, id)); |
- |
- InterfaceEndpoint* endpoint = new InterfaceEndpoint(this, id); |
- endpoints_[id] = endpoint; |
- if (encountered_error_) |
- UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED); |
+ { |
+ MayAutoLock locker(lock_.get()); |
+ do { |
+ if (next_interface_id_value_ >= kInterfaceIdNamespaceMask) |
+ next_interface_id_value_ = 1; |
+ id = next_interface_id_value_++; |
+ if (set_interface_id_namespace_bit_) |
+ id |= kInterfaceIdNamespaceMask; |
+ } while (base::ContainsKey(endpoints_, id)); |
+ |
+ InterfaceEndpoint* endpoint = new InterfaceEndpoint(this, id); |
+ endpoints_[id] = endpoint; |
+ if (encountered_error_) |
+ UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED); |
+ endpoint->set_handle_created(); |
+ } |
- endpoint->set_handle_created(); |
- *local_endpoint = CreateScopedInterfaceEndpointHandle(id, true); |
- *remote_endpoint = CreateScopedInterfaceEndpointHandle(id, false); |
+ if (!NotifyAssociation(&handle_to_send, id)) { |
+ // The peer handle of |handle_to_send|, which is supposed to join this |
+ // associated group, has been closed. |
+ { |
+ MayAutoLock locker(lock_.get()); |
+ InterfaceEndpoint* endpoint = FindEndpoint(id); |
+ if (endpoint) |
+ UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED); |
+ } |
+ |
+ control_message_proxy_.NotifyPeerEndpointClosed( |
+ id, handle_to_send.disconnect_reason()); |
+ } |
+ return id; |
} |
ScopedInterfaceEndpointHandle MultiplexRouter::CreateLocalEndpointHandle( |
@@ -469,29 +483,16 @@ ScopedInterfaceEndpointHandle MultiplexRouter::CreateLocalEndpointHandle( |
} |
endpoint->set_handle_created(); |
- return CreateScopedInterfaceEndpointHandle(id, true); |
+ return CreateScopedInterfaceEndpointHandle(id); |
} |
void MultiplexRouter::CloseEndpointHandle( |
InterfaceId id, |
- bool is_local, |
const base::Optional<DisconnectReason>& reason) { |
if (!IsValidInterfaceId(id)) |
return; |
MayAutoLock locker(lock_.get()); |
- |
- if (!is_local) { |
- DCHECK(base::ContainsKey(endpoints_, id)); |
- DCHECK(!IsMasterInterfaceId(id)); |
- |
- // We will receive a NotifyPeerEndpointClosed message from the other side. |
- MayAutoUnlock unlocker(lock_.get()); |
- control_message_proxy_.NotifyEndpointClosedBeforeSent(id); |
- |
- return; |
- } |
- |
DCHECK(base::ContainsKey(endpoints_, id)); |
InterfaceEndpoint* endpoint = endpoints_[id].get(); |
DCHECK(!endpoint->client()); |
@@ -680,22 +681,6 @@ bool MultiplexRouter::OnPeerAssociatedEndpointClosed( |
return true; |
} |
-bool MultiplexRouter::OnAssociatedEndpointClosedBeforeSent(InterfaceId id) { |
- if (IsMasterInterfaceId(id)) |
- return false; |
- |
- { |
- MayAutoLock locker(lock_.get()); |
- |
- InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, nullptr); |
- DCHECK(!endpoint->closed()); |
- UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED); |
- } |
- |
- control_message_proxy_.NotifyPeerEndpointClosed(id, base::nullopt); |
- return true; |
-} |
- |
void MultiplexRouter::OnPipeConnectionError() { |
DCHECK(thread_checker_.CalledOnValidThread()); |