Index: mojo/edk/system/channel.h |
diff --git a/mojo/edk/system/channel.h b/mojo/edk/system/channel.h |
index 4d65d9bcfa9df44f4a20f513f95cac17d9742dc2..64acb7d22b1768a4cfba2a2e5fdb276b64fcbb73 100644 |
--- a/mojo/edk/system/channel.h |
+++ b/mojo/edk/system/channel.h |
@@ -31,8 +31,9 @@ class PlatformSupport; |
namespace system { |
-class ChannelEndpoint; |
+class ChannelEndpointClient; |
class ChannelManager; |
+class MessageInTransitQueue; |
// This class is mostly thread-safe. It must be created on an I/O thread. |
// |Init()| must be called on that same thread before it becomes thread-safe (in |
@@ -105,21 +106,54 @@ class MOJO_SYSTEM_IMPL_EXPORT Channel |
ChannelEndpointId local_id, |
ChannelEndpointId remote_id); |
- // Returns the size of a serialized endpoint (see |SerializeEndpoint()| and |
+ // Returns the size of a serialized endpoint (see |SerializeEndpoint...()| and |
// |DeserializeEndpoint()| below). This value will remain constant for a given |
// instance of |Channel|. |
size_t GetSerializedEndpointSize() const; |
- // Serializes the given endpoint, writing to |destination| auxiliary |
- // information to be transmitted to the peer |Channel| via some other means. |
- // |destination| should point to a buffer of (at least) the size returned by |
+ // Endpoint serialization methods: From the |Channel|'s point of view, there |
+ // are three cases (discussed further below) and thus three methods. |
+ // |
+ // All three methods have a |destination| argument, which should be a buffer |
+ // to which auxiliary information will be written and which should be |
+ // transmitted to the peer |Channel| by some other means, but using this |
+ // |Channel|. It should be a buffer of (at least) the size returned by |
// |GetSerializedEndpointSize()| (exactly that much data will be written). |
- void SerializeEndpoint(scoped_refptr<ChannelEndpoint> endpoint, |
- void* destination); |
+ // |
+ // All three also have a |message_queue| argument, which if non-null is the |
+ // queue of messages already received by the endpoint to be serialized. |
+ // |
+ // Note that "serialize" really means "send" -- the |endpoint| will be sent |
+ // "immediately". The contents of the |destination| buffer can then be used to |
+ // claim the rematerialized endpoint from the peer |Channel|. (|destination| |
+ // must be sent using this |Channel|, since otherwise it may be received |
+ // before it is valid to the peer |Channel|.) |
+ // |
+ // Case 1: The endpoint's peer is already closed. |
+ // |
+ // Case 2: The endpoint's peer is local (i.e., it has a |
+ // |ChannelEndpointClient| but no peer |ChannelEndpoint|). |
+ // |
+ // Case 3: The endpoint's peer is remote (i.e., it has a peer |
+ // |ChannelEndpoint|). (This has two subcases: the peer endpoint may be on |
+ // this |Channel| or another |Channel|.) |
+ void SerializeEndpointWithClosedPeer(void* destination, |
+ MessageInTransitQueue* message_queue); |
+ // This one returns the |ChannelEndpoint| for the serialized endpoint (which |
+ // can be used by, e.g., a |ProxyMessagePipeEndpoint|. |
+ scoped_refptr<ChannelEndpoint> SerializeEndpointWithLocalPeer( |
+ void* destination, |
+ MessageInTransitQueue* message_queue, |
+ ChannelEndpointClient* endpoint_client, |
+ unsigned endpoint_client_port); |
+ void SerializeEndpointWithRemotePeer( |
+ void* destination, |
+ MessageInTransitQueue* message_queue, |
+ scoped_refptr<ChannelEndpoint> peer_endpoint); |
// Deserializes an endpoint that was sent from the peer |Channel| (using |
- // |SerializeEndpoint()|. |source| should be (a copy of) the data that |
- // |SerializeEndpoint()| wrote, and must be (at least) |
+ // |SerializeEndpoint...()|. |source| should be (a copy of) the data that |
+ // |SerializeEndpoint...()| wrote, and must be (at least) |
// |GetSerializedEndpointSize()| bytes. This returns the deserialized |
// |IncomingEndpoint| (which can be converted into a |MessagePipe|) or null on |
// error. |
@@ -166,7 +200,7 @@ class MOJO_SYSTEM_IMPL_EXPORT Channel |
// thread. |
void HandleLocalError(const base::StringPiece& error_message); |
- // Helper for |SerializeEndpoint()|: Attaches the given (non-bootstrap) |
+ // Helper for |SerializeEndpoint...()|: Attaches the given (non-bootstrap) |
// endpoint to this channel and runs it. This assigns the endpoint both local |
// and remote IDs. This will also send a |kSubtypeChannelAttachAndRunEndpoint| |
// message to the remote side to tell it to create an endpoint as well. This |
@@ -189,7 +223,7 @@ class MOJO_SYSTEM_IMPL_EXPORT Channel |
// Note: |ChannelEndpointClient|s (in particular, |MessagePipe|s) MUST NOT be |
// used under |lock_|. E.g., |lock_| can only be acquired after |
// |MessagePipe::lock_|, never before. Thus to call into a |
- // |ChannelEndpointClinet|, a reference should be acquired from |
+ // |ChannelEndpointClient|, a reference should be acquired from |
// |local_id_to_endpoint_map_| under |lock_| and then the lock released. |
base::Lock lock_; // Protects the members below. |