| 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 2f547bc2e52cf81ae0b7b6315b17e52278bdcab2..f05461840b271783a323e6d90dfd953fe75fcecf 100644
 | 
| --- a/mojo/public/cpp/bindings/lib/multiplex_router.cc
 | 
| +++ b/mojo/public/cpp/bindings/lib/multiplex_router.cc
 | 
| @@ -526,11 +526,18 @@ bool MultiplexRouter::OnPeerAssociatedEndpointClosed(InterfaceId id) {
 | 
|      return false;
 | 
|  
 | 
|    InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, nullptr);
 | 
| -  DCHECK(!endpoint->peer_closed());
 | 
|  
 | 
| -  if (endpoint->client())
 | 
| -    tasks_.push_back(Task::CreateNotifyErrorTask(endpoint));
 | 
| -  UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
 | 
| +  // It is possible that this endpoint has been set as peer closed. That is
 | 
| +  // because when the message pipe is closed, all the endpoints are updated with
 | 
| +  // PEER_ENDPOINT_CLOSED. We continue to process remaining tasks in the queue,
 | 
| +  // as long as there are refs keeping the router alive. If there is a
 | 
| +  // PeerAssociatedEndpointClosedEvent control message in the queue, we will get
 | 
| +  // here and see that the endpoint has been marked as peer closed.
 | 
| +  if (!endpoint->peer_closed()) {
 | 
| +    if (endpoint->client())
 | 
| +      tasks_.push_back(Task::CreateNotifyErrorTask(endpoint));
 | 
| +    UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
 | 
| +  }
 | 
|  
 | 
|    // No need to trigger a ProcessTasks() because it is already on the stack.
 | 
|  
 | 
| 
 |