Index: mojo/edk/system/node_controller.h |
diff --git a/mojo/edk/system/node_controller.h b/mojo/edk/system/node_controller.h |
index 35148a01cdcbad48e91b39385e554ae7c4d4cff7..0675e9743f7177bed66740f24dd0404217289cf0 100644 |
--- a/mojo/edk/system/node_controller.h |
+++ b/mojo/edk/system/node_controller.h |
@@ -82,42 +82,13 @@ class NodeController : public ports::NodeDelegate, |
int SendMessage(const ports::PortRef& port_ref, |
scoped_ptr<PortsMessage>* message); |
- using ReservePortCallback = base::Callback<void(const ports::PortRef& port)>; |
+ // Reserves a local port |port| associated with |token|. A peer holding a copy |
+ // of |token| can merge one of its own ports into this one. |
+ void ReservePort(const std::string& token, const ports::PortRef& port); |
- // Reserves a port associated with |token|. A peer may associate one of their |
- // own ports with this one by sending us a RequestPortConnection message with |
- // the same token value. |
- // |
- // Note that the reservation is made synchronously. In order to avoid races, |
- // reservations should be acquired before |token| is communicated to any |
- // potential peer. |
- // |
- // |callback| must be runnable on any thread and will be run with a reference |
- // to the new local port once connected. |
- void ReservePort(const std::string& token, |
- const ReservePortCallback& callback); |
- |
- // Eventually initializes a local port with a parent port peer identified by |
- // |token|. The parent should also have |token| and should alrady have |
- // reserved a port for it. |callback| must be runnable on any thread and will |
- // be run if and when the local port is connected. |
- void ConnectToParentPort(const ports::PortRef& local_port, |
- const std::string& token, |
- const base::Closure& callback); |
- |
- // Connects two reserved ports to each other. Useful when two independent |
- // systems in the same (parent) process need to establish a port pair without |
- // any direct knowledge of each other. |
- void ConnectReservedPorts(const std::string& token1, |
- const std::string& token2); |
- |
- // Connects a local port to a port on a remote node. Note that a connection to |
- // the remote node need not be established yet. The port will be connected |
- // ASAP, at which point |callback| will be run. |
- void ConnectToRemotePort(const ports::PortRef& local_port, |
- const ports::NodeName& remote_node_name, |
- const ports::PortName& remote_port_name, |
- const base::Closure& callback); |
+ // Merges a local port |port| into a port reserved by |token| in the parent. |
+ void MergePortIntoParent(const std::string& token, |
+ const ports::PortRef& port); |
// Creates a new shared buffer for use in the current process. |
scoped_refptr<PlatformSharedBuffer> CreateSharedBuffer(size_t num_bytes); |
@@ -138,44 +109,9 @@ class NodeController : public ports::NodeDelegate, |
scoped_refptr<NodeChannel>>; |
using OutgoingMessageQueue = std::queue<Channel::MessagePtr>; |
- // Tracks a pending token-based connection to a parent port. |
- struct PendingPortRequest { |
- PendingPortRequest(); |
- ~PendingPortRequest(); |
- |
- std::string token; |
- ports::PortRef local_port; |
- base::Closure callback; |
- }; |
- |
- // Tracks a reserved port. |
- struct ReservedPort { |
- ReservedPort(); |
- ~ReservedPort(); |
- |
- ports::PortRef local_port; |
- ReservePortCallback callback; |
- }; |
- |
- // Tracks a pending connection to a remote port on any peer. |
- struct PendingRemotePortConnection { |
- PendingRemotePortConnection(); |
- ~PendingRemotePortConnection(); |
- |
- ports::PortRef local_port; |
- ports::NodeName remote_node_name; |
- ports::PortName remote_port_name; |
- base::Closure callback; |
- }; |
- |
void ConnectToChildOnIOThread(base::ProcessHandle process_handle, |
ScopedPlatformHandle platform_handle); |
void ConnectToParentOnIOThread(ScopedPlatformHandle platform_handle); |
- void RequestParentPortConnectionOnIOThread(const ports::PortRef& local_port, |
- const std::string& token, |
- const base::Closure& callback); |
- void ConnectToRemotePortOnIOThread( |
- const PendingRemotePortConnection& connection); |
scoped_refptr<NodeChannel> GetPeerChannel(const ports::NodeName& name); |
scoped_refptr<NodeChannel> GetParentChannel(); |
@@ -215,12 +151,9 @@ class NodeController : public ports::NodeDelegate, |
const ports::NodeName& broker_name, |
ScopedPlatformHandle broker_channel) override; |
void OnPortsMessage(Channel::MessagePtr message) override; |
- void OnRequestPortConnection(const ports::NodeName& from_node, |
- const ports::PortName& connector_port_name, |
- const std::string& token) override; |
- void OnConnectToPort(const ports::NodeName& from_node, |
- const ports::PortName& connector_port_name, |
- const ports::PortName& connectee_port_name) override; |
+ void OnRequestPortMerge(const ports::NodeName& from_node, |
+ const ports::PortName& connector_port_name, |
+ const std::string& token) override; |
void OnRequestIntroduction(const ports::NodeName& from_node, |
const ports::NodeName& name) override; |
void OnIntroduce(const ports::NodeName& from_node, |
@@ -264,7 +197,13 @@ class NodeController : public ports::NodeDelegate, |
base::Lock reserved_ports_lock_; |
// Ports reserved by token. |
- base::hash_map<std::string, ReservedPort> reserved_ports_; |
+ base::hash_map<std::string, ports::PortRef> reserved_ports_; |
+ |
+ // Guards |pending_port_merges_|. |
+ base::Lock pending_port_merges_lock_; |
+ |
+ // A set of port merge requests awaiting parent connection. |
+ std::vector<std::pair<std::string, ports::PortRef>> pending_port_merges_; |
// Guards |parent_name_| and |bootstrap_parent_channel_|. |
base::Lock parent_lock_; |
@@ -307,17 +246,6 @@ class NodeController : public ports::NodeDelegate, |
// Channels to children during handshake. |
NodeMap pending_children_; |
- // Port connection requests which have been deferred until we have a parent. |
- std::vector<PendingPortRequest> pending_port_requests_; |
- |
- // Port connection requests awaiting a response from the parent. |
- std::unordered_map<ports::PortName, base::Closure> |
- pending_parent_port_connections_; |
- |
- // Port connections pending the availability of a remote peer node. |
- std::unordered_map<ports::NodeName, std::vector<PendingRemotePortConnection>> |
- pending_remote_port_connections_; |
- |
// Indicates whether this object should delete itself on IO thread shutdown. |
// Must only be accessed from the IO thread. |
bool destroy_on_io_thread_shutdown_ = false; |