| Index: mojo/edk/system/channel_endpoint.h
 | 
| diff --git a/mojo/edk/system/channel_endpoint.h b/mojo/edk/system/channel_endpoint.h
 | 
| index 71b6f9b72400e74cacae25220efa2fe6e904ac7f..90ee86b758399f912c93baac0d54b643e4d39036 100644
 | 
| --- a/mojo/edk/system/channel_endpoint.h
 | 
| +++ b/mojo/edk/system/channel_endpoint.h
 | 
| @@ -130,6 +130,15 @@ class MOJO_SYSTEM_IMPL_EXPORT ChannelEndpoint
 | 
|    // called.)
 | 
|    bool EnqueueMessage(scoped_ptr<MessageInTransit> message);
 | 
|  
 | 
| +  // Called to *replace* current client with a new client (which must differ
 | 
| +  // from the existing client). This must not be called after
 | 
| +  // |DetachFromClient()| has been called.
 | 
| +  //
 | 
| +  // This returns true in the typical case, and false if this endpoint has been
 | 
| +  // detached from the channel, in which case the caller should probably call
 | 
| +  // its (new) client's |OnDetachFromChannel()|.
 | 
| +  bool ReplaceClient(ChannelEndpointClient* client, unsigned client_port);
 | 
| +
 | 
|    // Called before the |ChannelEndpointClient| gives up its reference to this
 | 
|    // object.
 | 
|    void DetachFromClient();
 | 
| @@ -156,6 +165,10 @@ class MOJO_SYSTEM_IMPL_EXPORT ChannelEndpoint
 | 
|    // Must be called with |lock_| held.
 | 
|    bool WriteMessageNoLock(scoped_ptr<MessageInTransit> message);
 | 
|  
 | 
| +  // Resets |channel_| to null (and sets |is_detached_from_channel_|). This may
 | 
| +  // only be called if |channel_| is non-null. Must be called with |lock_| held.
 | 
| +  void ResetChannelNoLock();
 | 
| +
 | 
|    // Protects the members below.
 | 
|    base::Lock lock_;
 | 
|  
 | 
| @@ -168,6 +181,9 @@ class MOJO_SYSTEM_IMPL_EXPORT ChannelEndpoint
 | 
|    // WARNING: |ChannelEndpointClient| methods must not be called under |lock_|.
 | 
|    // Thus to make such a call, a reference must first be taken under |lock_| and
 | 
|    // the lock released.
 | 
| +  // WARNING: Beware of interactions with |ReplaceClient()|. By the time the
 | 
| +  // call is made, the client may have changed. This must be detected and dealt
 | 
| +  // with.
 | 
|    scoped_refptr<ChannelEndpointClient> client_;
 | 
|    unsigned client_port_;
 | 
|  
 | 
| @@ -177,6 +193,9 @@ class MOJO_SYSTEM_IMPL_EXPORT ChannelEndpoint
 | 
|    Channel* channel_;
 | 
|    ChannelEndpointId local_id_;
 | 
|    ChannelEndpointId remote_id_;
 | 
| +  // This distinguishes the two cases of |channel| being null: not yet attached
 | 
| +  // versus detached.
 | 
| +  bool is_detached_from_channel_;
 | 
|  
 | 
|    // This queue is used before we're running on a channel and ready to send
 | 
|    // messages to the channel.
 | 
| 
 |