| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_ | 5 #ifndef MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_ |
| 6 #define MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_ | 6 #define MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_ |
| 7 | 7 |
| 8 #include <queue> | 8 #include <queue> |
| 9 #include <unordered_map> | 9 #include <unordered_map> |
| 10 #include <unordered_set> | 10 #include <unordered_set> |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 | 75 |
| 76 // Closes a port. Use this in lieu of calling Node::ClosePort() directly, as | 76 // Closes a port. Use this in lieu of calling Node::ClosePort() directly, as |
| 77 // it ensures the port's observer has also been removed. | 77 // it ensures the port's observer has also been removed. |
| 78 void ClosePort(const ports::PortRef& port); | 78 void ClosePort(const ports::PortRef& port); |
| 79 | 79 |
| 80 // Sends a message on a port to its peer. If message send fails, |message| | 80 // Sends a message on a port to its peer. If message send fails, |message| |
| 81 // is left intact. Otherwise ownership is transferred and it's reset. | 81 // is left intact. Otherwise ownership is transferred and it's reset. |
| 82 int SendMessage(const ports::PortRef& port_ref, | 82 int SendMessage(const ports::PortRef& port_ref, |
| 83 scoped_ptr<PortsMessage>* message); | 83 scoped_ptr<PortsMessage>* message); |
| 84 | 84 |
| 85 using ReservePortCallback = base::Callback<void(const ports::PortRef& port)>; | 85 // Reserves a local port |port| associated with |token|. A peer holding a copy |
| 86 // of |token| can merge one of its own ports into this one. |
| 87 void ReservePort(const std::string& token, const ports::PortRef& port); |
| 86 | 88 |
| 87 // Reserves a port associated with |token|. A peer may associate one of their | 89 // Merges a local port |port| into a port reserved by |token| in the parent. |
| 88 // own ports with this one by sending us a RequestPortConnection message with | 90 void MergePortIntoParent(const std::string& token, |
| 89 // the same token value. | 91 const ports::PortRef& port); |
| 90 // | |
| 91 // Note that the reservation is made synchronously. In order to avoid races, | |
| 92 // reservations should be acquired before |token| is communicated to any | |
| 93 // potential peer. | |
| 94 // | |
| 95 // |callback| must be runnable on any thread and will be run with a reference | |
| 96 // to the new local port once connected. | |
| 97 void ReservePort(const std::string& token, | |
| 98 const ReservePortCallback& callback); | |
| 99 | |
| 100 // Eventually initializes a local port with a parent port peer identified by | |
| 101 // |token|. The parent should also have |token| and should alrady have | |
| 102 // reserved a port for it. |callback| must be runnable on any thread and will | |
| 103 // be run if and when the local port is connected. | |
| 104 void ConnectToParentPort(const ports::PortRef& local_port, | |
| 105 const std::string& token, | |
| 106 const base::Closure& callback); | |
| 107 | |
| 108 // Connects two reserved ports to each other. Useful when two independent | |
| 109 // systems in the same (parent) process need to establish a port pair without | |
| 110 // any direct knowledge of each other. | |
| 111 void ConnectReservedPorts(const std::string& token1, | |
| 112 const std::string& token2); | |
| 113 | |
| 114 // Connects a local port to a port on a remote node. Note that a connection to | |
| 115 // the remote node need not be established yet. The port will be connected | |
| 116 // ASAP, at which point |callback| will be run. | |
| 117 void ConnectToRemotePort(const ports::PortRef& local_port, | |
| 118 const ports::NodeName& remote_node_name, | |
| 119 const ports::PortName& remote_port_name, | |
| 120 const base::Closure& callback); | |
| 121 | 92 |
| 122 // Creates a new shared buffer for use in the current process. | 93 // Creates a new shared buffer for use in the current process. |
| 123 scoped_refptr<PlatformSharedBuffer> CreateSharedBuffer(size_t num_bytes); | 94 scoped_refptr<PlatformSharedBuffer> CreateSharedBuffer(size_t num_bytes); |
| 124 | 95 |
| 125 // Request that the Node be shut down cleanly. This may take an arbitrarily | 96 // Request that the Node be shut down cleanly. This may take an arbitrarily |
| 126 // long time to complete, at which point |callback| will be called. | 97 // long time to complete, at which point |callback| will be called. |
| 127 // | 98 // |
| 128 // Note that while it is safe to continue using the NodeController's public | 99 // Note that while it is safe to continue using the NodeController's public |
| 129 // interface after requesting shutdown, you do so at your own risk and there | 100 // interface after requesting shutdown, you do so at your own risk and there |
| 130 // is NO guarantee that new messages will be sent or ports will complete | 101 // is NO guarantee that new messages will be sent or ports will complete |
| 131 // transfer. | 102 // transfer. |
| 132 void RequestShutdown(const base::Closure& callback); | 103 void RequestShutdown(const base::Closure& callback); |
| 133 | 104 |
| 134 private: | 105 private: |
| 135 friend Core; | 106 friend Core; |
| 136 | 107 |
| 137 using NodeMap = std::unordered_map<ports::NodeName, | 108 using NodeMap = std::unordered_map<ports::NodeName, |
| 138 scoped_refptr<NodeChannel>>; | 109 scoped_refptr<NodeChannel>>; |
| 139 using OutgoingMessageQueue = std::queue<Channel::MessagePtr>; | 110 using OutgoingMessageQueue = std::queue<Channel::MessagePtr>; |
| 140 | 111 |
| 141 // Tracks a pending token-based connection to a parent port. | |
| 142 struct PendingPortRequest { | |
| 143 PendingPortRequest(); | |
| 144 ~PendingPortRequest(); | |
| 145 | |
| 146 std::string token; | |
| 147 ports::PortRef local_port; | |
| 148 base::Closure callback; | |
| 149 }; | |
| 150 | |
| 151 // Tracks a reserved port. | |
| 152 struct ReservedPort { | |
| 153 ReservedPort(); | |
| 154 ~ReservedPort(); | |
| 155 | |
| 156 ports::PortRef local_port; | |
| 157 ReservePortCallback callback; | |
| 158 }; | |
| 159 | |
| 160 // Tracks a pending connection to a remote port on any peer. | |
| 161 struct PendingRemotePortConnection { | |
| 162 PendingRemotePortConnection(); | |
| 163 ~PendingRemotePortConnection(); | |
| 164 | |
| 165 ports::PortRef local_port; | |
| 166 ports::NodeName remote_node_name; | |
| 167 ports::PortName remote_port_name; | |
| 168 base::Closure callback; | |
| 169 }; | |
| 170 | |
| 171 void ConnectToChildOnIOThread(base::ProcessHandle process_handle, | 112 void ConnectToChildOnIOThread(base::ProcessHandle process_handle, |
| 172 ScopedPlatformHandle platform_handle); | 113 ScopedPlatformHandle platform_handle); |
| 173 void ConnectToParentOnIOThread(ScopedPlatformHandle platform_handle); | 114 void ConnectToParentOnIOThread(ScopedPlatformHandle platform_handle); |
| 174 void RequestParentPortConnectionOnIOThread(const ports::PortRef& local_port, | |
| 175 const std::string& token, | |
| 176 const base::Closure& callback); | |
| 177 void ConnectToRemotePortOnIOThread( | |
| 178 const PendingRemotePortConnection& connection); | |
| 179 | 115 |
| 180 scoped_refptr<NodeChannel> GetPeerChannel(const ports::NodeName& name); | 116 scoped_refptr<NodeChannel> GetPeerChannel(const ports::NodeName& name); |
| 181 scoped_refptr<NodeChannel> GetParentChannel(); | 117 scoped_refptr<NodeChannel> GetParentChannel(); |
| 182 scoped_refptr<NodeChannel> GetBrokerChannel(); | 118 scoped_refptr<NodeChannel> GetBrokerChannel(); |
| 183 | 119 |
| 184 void AddPeer(const ports::NodeName& name, | 120 void AddPeer(const ports::NodeName& name, |
| 185 scoped_refptr<NodeChannel> channel, | 121 scoped_refptr<NodeChannel> channel, |
| 186 bool start_channel); | 122 bool start_channel); |
| 187 void DropPeer(const ports::NodeName& name); | 123 void DropPeer(const ports::NodeName& name); |
| 188 void SendPeerMessage(const ports::NodeName& name, | 124 void SendPeerMessage(const ports::NodeName& name, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 208 void OnAddBrokerClient(const ports::NodeName& from_node, | 144 void OnAddBrokerClient(const ports::NodeName& from_node, |
| 209 const ports::NodeName& client_name, | 145 const ports::NodeName& client_name, |
| 210 ScopedPlatformHandle process_handle) override; | 146 ScopedPlatformHandle process_handle) override; |
| 211 void OnBrokerClientAdded(const ports::NodeName& from_node, | 147 void OnBrokerClientAdded(const ports::NodeName& from_node, |
| 212 const ports::NodeName& client_name, | 148 const ports::NodeName& client_name, |
| 213 ScopedPlatformHandle broker_channel) override; | 149 ScopedPlatformHandle broker_channel) override; |
| 214 void OnAcceptBrokerClient(const ports::NodeName& from_node, | 150 void OnAcceptBrokerClient(const ports::NodeName& from_node, |
| 215 const ports::NodeName& broker_name, | 151 const ports::NodeName& broker_name, |
| 216 ScopedPlatformHandle broker_channel) override; | 152 ScopedPlatformHandle broker_channel) override; |
| 217 void OnPortsMessage(Channel::MessagePtr message) override; | 153 void OnPortsMessage(Channel::MessagePtr message) override; |
| 218 void OnRequestPortConnection(const ports::NodeName& from_node, | 154 void OnRequestPortMerge(const ports::NodeName& from_node, |
| 219 const ports::PortName& connector_port_name, | 155 const ports::PortName& connector_port_name, |
| 220 const std::string& token) override; | 156 const std::string& token) override; |
| 221 void OnConnectToPort(const ports::NodeName& from_node, | |
| 222 const ports::PortName& connector_port_name, | |
| 223 const ports::PortName& connectee_port_name) override; | |
| 224 void OnRequestIntroduction(const ports::NodeName& from_node, | 157 void OnRequestIntroduction(const ports::NodeName& from_node, |
| 225 const ports::NodeName& name) override; | 158 const ports::NodeName& name) override; |
| 226 void OnIntroduce(const ports::NodeName& from_node, | 159 void OnIntroduce(const ports::NodeName& from_node, |
| 227 const ports::NodeName& name, | 160 const ports::NodeName& name, |
| 228 ScopedPlatformHandle channel_handle) override; | 161 ScopedPlatformHandle channel_handle) override; |
| 229 #if defined(OS_WIN) | 162 #if defined(OS_WIN) |
| 230 void OnRelayPortsMessage(const ports::NodeName& from_node, | 163 void OnRelayPortsMessage(const ports::NodeName& from_node, |
| 231 base::ProcessHandle from_process, | 164 base::ProcessHandle from_process, |
| 232 const ports::NodeName& destination, | 165 const ports::NodeName& destination, |
| 233 Channel::MessagePtr message) override; | 166 Channel::MessagePtr message) override; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 257 NodeMap peers_; | 190 NodeMap peers_; |
| 258 | 191 |
| 259 // Outgoing message queues for peers we've heard of but can't yet talk to. | 192 // Outgoing message queues for peers we've heard of but can't yet talk to. |
| 260 std::unordered_map<ports::NodeName, OutgoingMessageQueue> | 193 std::unordered_map<ports::NodeName, OutgoingMessageQueue> |
| 261 pending_peer_messages_; | 194 pending_peer_messages_; |
| 262 | 195 |
| 263 // Guards |reserved_ports_|. | 196 // Guards |reserved_ports_|. |
| 264 base::Lock reserved_ports_lock_; | 197 base::Lock reserved_ports_lock_; |
| 265 | 198 |
| 266 // Ports reserved by token. | 199 // Ports reserved by token. |
| 267 base::hash_map<std::string, ReservedPort> reserved_ports_; | 200 base::hash_map<std::string, ports::PortRef> reserved_ports_; |
| 201 |
| 202 // Guards |pending_port_merges_|. |
| 203 base::Lock pending_port_merges_lock_; |
| 204 |
| 205 // A set of port merge requests awaiting parent connection. |
| 206 std::vector<std::pair<std::string, ports::PortRef>> pending_port_merges_; |
| 268 | 207 |
| 269 // Guards |parent_name_| and |bootstrap_parent_channel_|. | 208 // Guards |parent_name_| and |bootstrap_parent_channel_|. |
| 270 base::Lock parent_lock_; | 209 base::Lock parent_lock_; |
| 271 | 210 |
| 272 // The name of our parent node, if any. | 211 // The name of our parent node, if any. |
| 273 ports::NodeName parent_name_; | 212 ports::NodeName parent_name_; |
| 274 | 213 |
| 275 // A temporary reference to the parent channel before we know their name. | 214 // A temporary reference to the parent channel before we know their name. |
| 276 scoped_refptr<NodeChannel> bootstrap_parent_channel_; | 215 scoped_refptr<NodeChannel> bootstrap_parent_channel_; |
| 277 | 216 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 300 // begin polling the Node to see if clean shutdown is possible any time the | 239 // begin polling the Node to see if clean shutdown is possible any time the |
| 301 // Node's state is modified by the controller. | 240 // Node's state is modified by the controller. |
| 302 base::Closure shutdown_callback_; | 241 base::Closure shutdown_callback_; |
| 303 | 242 |
| 304 // All other fields below must only be accessed on the I/O thread, i.e., the | 243 // All other fields below must only be accessed on the I/O thread, i.e., the |
| 305 // thread on which core_->io_task_runner() runs tasks. | 244 // thread on which core_->io_task_runner() runs tasks. |
| 306 | 245 |
| 307 // Channels to children during handshake. | 246 // Channels to children during handshake. |
| 308 NodeMap pending_children_; | 247 NodeMap pending_children_; |
| 309 | 248 |
| 310 // Port connection requests which have been deferred until we have a parent. | |
| 311 std::vector<PendingPortRequest> pending_port_requests_; | |
| 312 | |
| 313 // Port connection requests awaiting a response from the parent. | |
| 314 std::unordered_map<ports::PortName, base::Closure> | |
| 315 pending_parent_port_connections_; | |
| 316 | |
| 317 // Port connections pending the availability of a remote peer node. | |
| 318 std::unordered_map<ports::NodeName, std::vector<PendingRemotePortConnection>> | |
| 319 pending_remote_port_connections_; | |
| 320 | |
| 321 // Indicates whether this object should delete itself on IO thread shutdown. | 249 // Indicates whether this object should delete itself on IO thread shutdown. |
| 322 // Must only be accessed from the IO thread. | 250 // Must only be accessed from the IO thread. |
| 323 bool destroy_on_io_thread_shutdown_ = false; | 251 bool destroy_on_io_thread_shutdown_ = false; |
| 324 | 252 |
| 325 #if defined(OS_POSIX) | 253 #if defined(OS_POSIX) |
| 326 // Broker for sync shared buffer creation (posix-only) in children. | 254 // Broker for sync shared buffer creation (posix-only) in children. |
| 327 scoped_ptr<Broker> broker_; | 255 scoped_ptr<Broker> broker_; |
| 328 #endif | 256 #endif |
| 329 | 257 |
| 330 DISALLOW_COPY_AND_ASSIGN(NodeController); | 258 DISALLOW_COPY_AND_ASSIGN(NodeController); |
| 331 }; | 259 }; |
| 332 | 260 |
| 333 } // namespace edk | 261 } // namespace edk |
| 334 } // namespace mojo | 262 } // namespace mojo |
| 335 | 263 |
| 336 #endif // MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_ | 264 #endif // MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_ |
| OLD | NEW |