Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(825)

Side by Side Diff: mojo/edk/system/node_controller.h

Issue 2019973002: [mojo-edk] Bind a child token to child launches and port reservations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mojo/edk/system/core.cc ('k') | mojo/edk/system/node_controller.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <memory> 8 #include <memory>
9 #include <queue> 9 #include <queue>
10 #include <unordered_map> 10 #include <unordered_map>
11 #include <unordered_set> 11 #include <unordered_set>
12 #include <utility>
12 #include <vector> 13 #include <vector>
13 14
14 #include "base/callback.h" 15 #include "base/callback.h"
15 #include "base/containers/hash_tables.h" 16 #include "base/containers/hash_tables.h"
16 #include "base/macros.h" 17 #include "base/macros.h"
17 #include "base/memory/ref_counted.h" 18 #include "base/memory/ref_counted.h"
18 #include "base/task_runner.h" 19 #include "base/task_runner.h"
19 #include "mojo/edk/embedder/platform_handle_vector.h" 20 #include "mojo/edk/embedder/platform_handle_vector.h"
20 #include "mojo/edk/embedder/platform_shared_buffer.h" 21 #include "mojo/edk/embedder/platform_shared_buffer.h"
21 #include "mojo/edk/embedder/scoped_platform_handle.h" 22 #include "mojo/edk/embedder/scoped_platform_handle.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 // Create the relay used to transfer mach ports between processes. 66 // Create the relay used to transfer mach ports between processes.
66 void CreateMachPortRelay(base::PortProvider* port_provider); 67 void CreateMachPortRelay(base::PortProvider* port_provider);
67 #endif 68 #endif
68 69
69 // Called exactly once, shortly after construction, and before any other 70 // Called exactly once, shortly after construction, and before any other
70 // methods are called on this object. 71 // methods are called on this object.
71 void SetIOTaskRunner(scoped_refptr<base::TaskRunner> io_task_runner); 72 void SetIOTaskRunner(scoped_refptr<base::TaskRunner> io_task_runner);
72 73
73 // Connects this node to a child node. This node will initiate a handshake. 74 // Connects this node to a child node. This node will initiate a handshake.
74 void ConnectToChild(base::ProcessHandle process_handle, 75 void ConnectToChild(base::ProcessHandle process_handle,
75 ScopedPlatformHandle platform_handle); 76 ScopedPlatformHandle platform_handle,
77 const std::string& child_token);
78
79 // Closes all reserved ports which associated with the child process
80 // |child_token|.
81 void CloseChildPorts(const std::string& child_token);
76 82
77 // Connects this node to a parent node. The parent node will initiate a 83 // Connects this node to a parent node. The parent node will initiate a
78 // handshake. 84 // handshake.
79 void ConnectToParent(ScopedPlatformHandle platform_handle); 85 void ConnectToParent(ScopedPlatformHandle platform_handle);
80 86
81 // Sets a port's observer. If |observer| is null the port's current observer 87 // Sets a port's observer. If |observer| is null the port's current observer
82 // is removed. 88 // is removed.
83 void SetPortObserver(const ports::PortRef& port, 89 void SetPortObserver(const ports::PortRef& port,
84 const scoped_refptr<PortObserver>& observer); 90 const scoped_refptr<PortObserver>& observer);
85 91
86 // Closes a port. Use this in lieu of calling Node::ClosePort() directly, as 92 // Closes a port. Use this in lieu of calling Node::ClosePort() directly, as
87 // it ensures the port's observer has also been removed. 93 // it ensures the port's observer has also been removed.
88 void ClosePort(const ports::PortRef& port); 94 void ClosePort(const ports::PortRef& port);
89 95
90 // Sends a message on a port to its peer. 96 // Sends a message on a port to its peer.
91 int SendMessage(const ports::PortRef& port_ref, 97 int SendMessage(const ports::PortRef& port_ref,
92 std::unique_ptr<PortsMessage> message); 98 std::unique_ptr<PortsMessage> message);
93 99
94 // Reserves a local port |port| associated with |token|. A peer holding a copy 100 // Reserves a local port |port| associated with |token|. A peer holding a copy
95 // of |token| can merge one of its own ports into this one. 101 // of |token| can merge one of its own ports into this one.
96 void ReservePort(const std::string& token, const ports::PortRef& port); 102 void ReservePort(const std::string& token, const ports::PortRef& port,
103 const std::string& child_token);
97 104
98 // Merges a local port |port| into a port reserved by |token| in the parent. 105 // Merges a local port |port| into a port reserved by |token| in the parent.
99 void MergePortIntoParent(const std::string& token, 106 void MergePortIntoParent(const std::string& token,
100 const ports::PortRef& port); 107 const ports::PortRef& port);
101 108
102 // Merges two local ports together. 109 // Merges two local ports together.
103 int MergeLocalPorts(const ports::PortRef& port0, const ports::PortRef& port1); 110 int MergeLocalPorts(const ports::PortRef& port0, const ports::PortRef& port1);
104 111
105 // Creates a new shared buffer for use in the current process. 112 // Creates a new shared buffer for use in the current process.
106 scoped_refptr<PlatformSharedBuffer> CreateSharedBuffer(size_t num_bytes); 113 scoped_refptr<PlatformSharedBuffer> CreateSharedBuffer(size_t num_bytes);
107 114
108 // Request that the Node be shut down cleanly. This may take an arbitrarily 115 // Request that the Node be shut down cleanly. This may take an arbitrarily
109 // long time to complete, at which point |callback| will be called. 116 // long time to complete, at which point |callback| will be called.
110 // 117 //
111 // Note that while it is safe to continue using the NodeController's public 118 // Note that while it is safe to continue using the NodeController's public
112 // interface after requesting shutdown, you do so at your own risk and there 119 // interface after requesting shutdown, you do so at your own risk and there
113 // is NO guarantee that new messages will be sent or ports will complete 120 // is NO guarantee that new messages will be sent or ports will complete
114 // transfer. 121 // transfer.
115 void RequestShutdown(const base::Closure& callback); 122 void RequestShutdown(const base::Closure& callback);
116 123
117 private: 124 private:
118 friend Core; 125 friend Core;
119 126
120 using NodeMap = std::unordered_map<ports::NodeName, 127 using NodeMap = std::unordered_map<ports::NodeName,
121 scoped_refptr<NodeChannel>>; 128 scoped_refptr<NodeChannel>>;
122 using OutgoingMessageQueue = std::queue<Channel::MessagePtr>; 129 using OutgoingMessageQueue = std::queue<Channel::MessagePtr>;
123 130
131 struct ReservedPort {
132 ports::PortRef port;
133 const std::string child_token;
134 };
135
124 void ConnectToChildOnIOThread(base::ProcessHandle process_handle, 136 void ConnectToChildOnIOThread(base::ProcessHandle process_handle,
125 ScopedPlatformHandle platform_handle); 137 ScopedPlatformHandle platform_handle,
138 ports::NodeName token);
126 void ConnectToParentOnIOThread(ScopedPlatformHandle platform_handle); 139 void ConnectToParentOnIOThread(ScopedPlatformHandle platform_handle);
127 140
128 scoped_refptr<NodeChannel> GetPeerChannel(const ports::NodeName& name); 141 scoped_refptr<NodeChannel> GetPeerChannel(const ports::NodeName& name);
129 scoped_refptr<NodeChannel> GetParentChannel(); 142 scoped_refptr<NodeChannel> GetParentChannel();
130 scoped_refptr<NodeChannel> GetBrokerChannel(); 143 scoped_refptr<NodeChannel> GetBrokerChannel();
131 144
132 void AddPeer(const ports::NodeName& name, 145 void AddPeer(const ports::NodeName& name,
133 scoped_refptr<NodeChannel> channel, 146 scoped_refptr<NodeChannel> channel,
134 bool start_channel); 147 bool start_channel);
135 void DropPeer(const ports::NodeName& name); 148 void DropPeer(const ports::NodeName& name);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 // Guards |peers_| and |pending_peer_messages_|. 215 // Guards |peers_| and |pending_peer_messages_|.
203 base::Lock peers_lock_; 216 base::Lock peers_lock_;
204 217
205 // Channels to known peers, including parent and children, if any. 218 // Channels to known peers, including parent and children, if any.
206 NodeMap peers_; 219 NodeMap peers_;
207 220
208 // Outgoing message queues for peers we've heard of but can't yet talk to. 221 // Outgoing message queues for peers we've heard of but can't yet talk to.
209 std::unordered_map<ports::NodeName, OutgoingMessageQueue> 222 std::unordered_map<ports::NodeName, OutgoingMessageQueue>
210 pending_peer_messages_; 223 pending_peer_messages_;
211 224
212 // Guards |reserved_ports_|. 225 // Guards |reserved_ports_| and |pending_child_tokens_|.
213 base::Lock reserved_ports_lock_; 226 base::Lock reserved_ports_lock_;
214 227
215 // Ports reserved by token. 228 // Ports reserved by token. Key is the port token.
216 base::hash_map<std::string, ports::PortRef> reserved_ports_; 229 base::hash_map<std::string, ReservedPort> reserved_ports_;
230 // TODO(amistry): This _really_ needs to be a bimap. Unfortunately, we don't
231 // have one yet :(
232 std::unordered_map<ports::NodeName, std::string> pending_child_tokens_;
217 233
218 // Guards |pending_port_merges_|. 234 // Guards |pending_port_merges_|.
219 base::Lock pending_port_merges_lock_; 235 base::Lock pending_port_merges_lock_;
220 236
221 // A set of port merge requests awaiting parent connection. 237 // A set of port merge requests awaiting parent connection.
222 std::vector<std::pair<std::string, ports::PortRef>> pending_port_merges_; 238 std::vector<std::pair<std::string, ports::PortRef>> pending_port_merges_;
223 239
224 // Guards |parent_name_| and |bootstrap_parent_channel_|. 240 // Guards |parent_name_| and |bootstrap_parent_channel_|.
225 base::Lock parent_lock_; 241 base::Lock parent_lock_;
226 242
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 std::unique_ptr<MachPortRelay> mach_port_relay_; 297 std::unique_ptr<MachPortRelay> mach_port_relay_;
282 #endif 298 #endif
283 299
284 DISALLOW_COPY_AND_ASSIGN(NodeController); 300 DISALLOW_COPY_AND_ASSIGN(NodeController);
285 }; 301 };
286 302
287 } // namespace edk 303 } // namespace edk
288 } // namespace mojo 304 } // namespace mojo
289 305
290 #endif // MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_ 306 #endif // MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
OLDNEW
« no previous file with comments | « mojo/edk/system/core.cc ('k') | mojo/edk/system/node_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698