| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #include "mojo/edk/system/child_broker.h" | 5 #include "mojo/edk/system/child_broker.h" |
| 6 | 6 |
| 7 #include <utility> |
| 8 |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 8 #include "base/logging.h" | 10 #include "base/logging.h" |
| 9 #include "mojo/edk/embedder/embedder_internal.h" | 11 #include "mojo/edk/embedder/embedder_internal.h" |
| 10 #include "mojo/edk/embedder/platform_channel_pair.h" | 12 #include "mojo/edk/embedder/platform_channel_pair.h" |
| 11 #include "mojo/edk/system/broker_messages.h" | 13 #include "mojo/edk/system/broker_messages.h" |
| 12 #include "mojo/edk/system/message_pipe_dispatcher.h" | 14 #include "mojo/edk/system/message_pipe_dispatcher.h" |
| 13 | 15 |
| 14 namespace mojo { | 16 namespace mojo { |
| 15 namespace edk { | 17 namespace edk { |
| 16 | 18 |
| 17 ChildBroker* ChildBroker::GetInstance() { | 19 ChildBroker* ChildBroker::GetInstance() { |
| 18 return base::Singleton< | 20 return base::Singleton< |
| 19 ChildBroker, base::LeakySingletonTraits<ChildBroker>>::get(); | 21 ChildBroker, base::LeakySingletonTraits<ChildBroker>>::get(); |
| 20 } | 22 } |
| 21 | 23 |
| 22 void ChildBroker::SetChildBrokerHostHandle(ScopedPlatformHandle handle) { | 24 void ChildBroker::SetChildBrokerHostHandle(ScopedPlatformHandle handle) { |
| 23 ScopedPlatformHandle parent_async_channel_handle; | 25 ScopedPlatformHandle parent_async_channel_handle; |
| 24 #if defined(OS_POSIX) | 26 #if defined(OS_POSIX) |
| 25 parent_async_channel_handle = handle.Pass(); | 27 parent_async_channel_handle = std::move(handle); |
| 26 #else | 28 #else |
| 27 // On Windows we have two pipes to the parent. The first is for the token | 29 // On Windows we have two pipes to the parent. The first is for the token |
| 28 // exchange for creating and passing handles, since the child needs the | 30 // exchange for creating and passing handles, since the child needs the |
| 29 // parent's help if it is sandboxed. The second is the same as POSIX, which is | 31 // parent's help if it is sandboxed. The second is the same as POSIX, which is |
| 30 // used for multiplexing related messages. So on Windows, we send the second | 32 // used for multiplexing related messages. So on Windows, we send the second |
| 31 // pipe as the first string over the first one. | 33 // pipe as the first string over the first one. |
| 32 parent_sync_channel_ = handle.Pass(); | 34 parent_sync_channel_ = handle.Pass(); |
| 33 | 35 |
| 34 HANDLE parent_handle = INVALID_HANDLE_VALUE; | 36 HANDLE parent_handle = INVALID_HANDLE_VALUE; |
| 35 DWORD bytes_read = 0; | 37 DWORD bytes_read = 0; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 pending_inprocess_connects_[pipe_id] = message_pipe; | 114 pending_inprocess_connects_[pipe_id] = message_pipe; |
| 113 return; | 115 return; |
| 114 } | 116 } |
| 115 // Both ends of the message pipe are in the same process. | 117 // Both ends of the message pipe are in the same process. |
| 116 // First, tell the browser side that to remove its bookkeeping for a pending | 118 // First, tell the browser side that to remove its bookkeeping for a pending |
| 117 // connect, since it'll never get the other side. | 119 // connect, since it'll never get the other side. |
| 118 | 120 |
| 119 data.type = CANCEL_CONNECT_MESSAGE_PIPE; | 121 data.type = CANCEL_CONNECT_MESSAGE_PIPE; |
| 120 scoped_ptr<MessageInTransit> message(new MessageInTransit( | 122 scoped_ptr<MessageInTransit> message(new MessageInTransit( |
| 121 MessageInTransit::Type::MESSAGE, sizeof(data), &data)); | 123 MessageInTransit::Type::MESSAGE, sizeof(data), &data)); |
| 122 WriteAsyncMessage(message.Pass()); | 124 WriteAsyncMessage(std::move(message)); |
| 123 | 125 |
| 124 if (!in_process_pipes_channel1_) { | 126 if (!in_process_pipes_channel1_) { |
| 125 ScopedPlatformHandle server_handle, client_handle; | 127 ScopedPlatformHandle server_handle, client_handle; |
| 126 #if defined(OS_WIN) | 128 #if defined(OS_WIN) |
| 127 CreatePlatformChannelPairNoLock(&server_handle, &client_handle); | 129 CreatePlatformChannelPairNoLock(&server_handle, &client_handle); |
| 128 #else | 130 #else |
| 129 PlatformChannelPair channel_pair; | 131 PlatformChannelPair channel_pair; |
| 130 server_handle = channel_pair.PassServerHandle(); | 132 server_handle = channel_pair.PassServerHandle(); |
| 131 client_handle = channel_pair.PassClientHandle(); | 133 client_handle = channel_pair.PassClientHandle(); |
| 132 #endif | 134 #endif |
| 133 in_process_pipes_channel1_ = new RoutedRawChannel( | 135 in_process_pipes_channel1_ = new RoutedRawChannel( |
| 134 server_handle.Pass(), | 136 std::move(server_handle), |
| 135 base::Bind(&ChildBroker::ChannelDestructed, base::Unretained(this))); | 137 base::Bind(&ChildBroker::ChannelDestructed, base::Unretained(this))); |
| 136 in_process_pipes_channel2_ = new RoutedRawChannel( | 138 in_process_pipes_channel2_ = new RoutedRawChannel( |
| 137 client_handle.Pass(), | 139 std::move(client_handle), |
| 138 base::Bind(&ChildBroker::ChannelDestructed, base::Unretained(this))); | 140 base::Bind(&ChildBroker::ChannelDestructed, base::Unretained(this))); |
| 139 } | 141 } |
| 140 | 142 |
| 141 AttachMessagePipe(pending_connects_[pipe_id], pipe_id, | 143 AttachMessagePipe(pending_connects_[pipe_id], pipe_id, |
| 142 in_process_pipes_channel1_); | 144 in_process_pipes_channel1_); |
| 143 AttachMessagePipe(message_pipe, pipe_id, in_process_pipes_channel2_); | 145 AttachMessagePipe(message_pipe, pipe_id, in_process_pipes_channel2_); |
| 144 pending_connects_.erase(pipe_id); | 146 pending_connects_.erase(pipe_id); |
| 145 return; | 147 return; |
| 146 } | 148 } |
| 147 | 149 |
| 148 data.type = CONNECT_MESSAGE_PIPE; | 150 data.type = CONNECT_MESSAGE_PIPE; |
| 149 scoped_ptr<MessageInTransit> message(new MessageInTransit( | 151 scoped_ptr<MessageInTransit> message(new MessageInTransit( |
| 150 MessageInTransit::Type::MESSAGE, sizeof(data), &data)); | 152 MessageInTransit::Type::MESSAGE, sizeof(data), &data)); |
| 151 pending_connects_[pipe_id] = message_pipe; | 153 pending_connects_[pipe_id] = message_pipe; |
| 152 WriteAsyncMessage(message.Pass()); | 154 WriteAsyncMessage(std::move(message)); |
| 153 } | 155 } |
| 154 | 156 |
| 155 void ChildBroker::CloseMessagePipe( | 157 void ChildBroker::CloseMessagePipe( |
| 156 uint64_t pipe_id, MessagePipeDispatcher* message_pipe) { | 158 uint64_t pipe_id, MessagePipeDispatcher* message_pipe) { |
| 157 DCHECK(internal::g_io_thread_task_runner->RunsTasksOnCurrentThread()); | 159 DCHECK(internal::g_io_thread_task_runner->RunsTasksOnCurrentThread()); |
| 158 CHECK(connected_pipes_.find(message_pipe) != connected_pipes_.end()); | 160 CHECK(connected_pipes_.find(message_pipe) != connected_pipes_.end()); |
| 159 connected_pipes_[message_pipe]->RemoveRoute(pipe_id); | 161 connected_pipes_[message_pipe]->RemoveRoute(pipe_id); |
| 160 connected_pipes_.erase(message_pipe); | 162 connected_pipes_.erase(message_pipe); |
| 161 } | 163 } |
| 162 | 164 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 184 if (type == CONNECT_TO_PROCESS) { | 186 if (type == CONNECT_TO_PROCESS) { |
| 185 DCHECK_EQ(platform_handles->size(), 1u); | 187 DCHECK_EQ(platform_handles->size(), 1u); |
| 186 ScopedPlatformHandle handle((*platform_handles.get())[0]); | 188 ScopedPlatformHandle handle((*platform_handles.get())[0]); |
| 187 (*platform_handles.get())[0] = PlatformHandle(); | 189 (*platform_handles.get())[0] = PlatformHandle(); |
| 188 | 190 |
| 189 const ConnectToProcessMessage* message = | 191 const ConnectToProcessMessage* message = |
| 190 static_cast<const ConnectToProcessMessage*>(message_view.bytes()); | 192 static_cast<const ConnectToProcessMessage*>(message_view.bytes()); |
| 191 | 193 |
| 192 CHECK(channels_.find(message->process_id) == channels_.end()); | 194 CHECK(channels_.find(message->process_id) == channels_.end()); |
| 193 channels_[message->process_id] = new RoutedRawChannel( | 195 channels_[message->process_id] = new RoutedRawChannel( |
| 194 handle.Pass(), | 196 std::move(handle), |
| 195 base::Bind(&ChildBroker::ChannelDestructed, base::Unretained(this))); | 197 base::Bind(&ChildBroker::ChannelDestructed, base::Unretained(this))); |
| 196 } else if (type == PEER_PIPE_CONNECTED) { | 198 } else if (type == PEER_PIPE_CONNECTED) { |
| 197 DCHECK(!platform_handles); | 199 DCHECK(!platform_handles); |
| 198 const PeerPipeConnectedMessage* message = | 200 const PeerPipeConnectedMessage* message = |
| 199 static_cast<const PeerPipeConnectedMessage*>(message_view.bytes()); | 201 static_cast<const PeerPipeConnectedMessage*>(message_view.bytes()); |
| 200 | 202 |
| 201 uint64_t pipe_id = message->pipe_id; | 203 uint64_t pipe_id = message->pipe_id; |
| 202 uint64_t peer_pid = message->process_id; | 204 uint64_t peer_pid = message->process_id; |
| 203 | 205 |
| 204 CHECK(pending_connects_.find(pipe_id) != pending_connects_.end()); | 206 CHECK(pending_connects_.find(pipe_id) != pending_connects_.end()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 230 channels_.erase(it.first); | 232 channels_.erase(it.first); |
| 231 break; | 233 break; |
| 232 } | 234 } |
| 233 } | 235 } |
| 234 } | 236 } |
| 235 | 237 |
| 236 void ChildBroker::WriteAsyncMessage(scoped_ptr<MessageInTransit> message) { | 238 void ChildBroker::WriteAsyncMessage(scoped_ptr<MessageInTransit> message) { |
| 237 DCHECK(internal::g_io_thread_task_runner->RunsTasksOnCurrentThread()); | 239 DCHECK(internal::g_io_thread_task_runner->RunsTasksOnCurrentThread()); |
| 238 message->set_route_id(kBrokerRouteId); | 240 message->set_route_id(kBrokerRouteId); |
| 239 if (parent_async_channel_) { | 241 if (parent_async_channel_) { |
| 240 parent_async_channel_->channel()->WriteMessage(message.Pass()); | 242 parent_async_channel_->channel()->WriteMessage(std::move(message)); |
| 241 } else { | 243 } else { |
| 242 async_channel_queue_.AddMessage(message.Pass()); | 244 async_channel_queue_.AddMessage(std::move(message)); |
| 243 } | 245 } |
| 244 } | 246 } |
| 245 | 247 |
| 246 void ChildBroker::InitAsyncChannel( | 248 void ChildBroker::InitAsyncChannel( |
| 247 ScopedPlatformHandle parent_async_channel_handle) { | 249 ScopedPlatformHandle parent_async_channel_handle) { |
| 248 DCHECK(internal::g_io_thread_task_runner->RunsTasksOnCurrentThread()); | 250 DCHECK(internal::g_io_thread_task_runner->RunsTasksOnCurrentThread()); |
| 249 | 251 |
| 250 parent_async_channel_ = new RoutedRawChannel( | 252 parent_async_channel_ = new RoutedRawChannel( |
| 251 parent_async_channel_handle.Pass() , | 253 std::move(parent_async_channel_handle), |
| 252 base::Bind(&ChildBroker::ChannelDestructed, base::Unretained(this))); | 254 base::Bind(&ChildBroker::ChannelDestructed, base::Unretained(this))); |
| 253 parent_async_channel_->AddRoute(kBrokerRouteId, this); | 255 parent_async_channel_->AddRoute(kBrokerRouteId, this); |
| 254 while (!async_channel_queue_.IsEmpty()) { | 256 while (!async_channel_queue_.IsEmpty()) { |
| 255 parent_async_channel_->channel()->WriteMessage( | 257 parent_async_channel_->channel()->WriteMessage( |
| 256 async_channel_queue_.GetMessage()); | 258 async_channel_queue_.GetMessage()); |
| 257 } | 259 } |
| 258 | 260 |
| 259 while (!pending_inprocess_connects_.empty()) { | 261 while (!pending_inprocess_connects_.empty()) { |
| 260 ConnectMessagePipe(pending_inprocess_connects_.begin()->first, | 262 ConnectMessagePipe(pending_inprocess_connects_.begin()->first, |
| 261 pending_inprocess_connects_.begin()->second); | 263 pending_inprocess_connects_.begin()->second); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 if (WriteAndReadResponse(&message, handles, response_size)) { | 324 if (WriteAndReadResponse(&message, handles, response_size)) { |
| 323 server->reset(PlatformHandle(handles[0])); | 325 server->reset(PlatformHandle(handles[0])); |
| 324 client->reset(PlatformHandle(handles[1])); | 326 client->reset(PlatformHandle(handles[1])); |
| 325 } | 327 } |
| 326 } | 328 } |
| 327 | 329 |
| 328 #endif | 330 #endif |
| 329 | 331 |
| 330 } // namespace edk | 332 } // namespace edk |
| 331 } // namespace mojo | 333 } // namespace mojo |
| OLD | NEW |