OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ipc/ipc_channel_mojo.h" | 5 #include "ipc/ipc_channel_mojo.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 // ChannelMojo from a different thread. | 275 // ChannelMojo from a different thread. |
276 bootstrap_ = | 276 bootstrap_ = |
277 MojoBootstrap::Create(std::move(handle), mode, this, ipc_task_runner); | 277 MojoBootstrap::Create(std::move(handle), mode, this, ipc_task_runner); |
278 } | 278 } |
279 | 279 |
280 ChannelMojo::~ChannelMojo() { | 280 ChannelMojo::~ChannelMojo() { |
281 Close(); | 281 Close(); |
282 } | 282 } |
283 | 283 |
284 bool ChannelMojo::Connect() { | 284 bool ChannelMojo::Connect() { |
285 if (!ConnectPaused()) | |
286 return false; | |
287 | |
288 Unpause(true); | |
289 return true; | |
290 } | |
291 | |
292 bool ChannelMojo::ConnectPaused() { | |
293 WillConnect(); | 285 WillConnect(); |
294 | 286 |
295 DCHECK(!task_runner_); | 287 DCHECK(!task_runner_); |
296 task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 288 task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
297 DCHECK(!message_reader_); | 289 DCHECK(!message_reader_); |
298 | 290 |
299 bootstrap_->Connect(); | 291 bootstrap_->Connect(); |
300 return true; | 292 return true; |
301 } | 293 } |
302 | 294 |
| 295 void ChannelMojo::Pause() { |
| 296 bootstrap_->Pause(); |
| 297 } |
| 298 |
303 void ChannelMojo::Unpause(bool flush) { | 299 void ChannelMojo::Unpause(bool flush) { |
304 bootstrap_->Start(); | 300 bootstrap_->Unpause(); |
305 | |
306 // Ensure that no matter what messages have been queued so far, the first | |
307 // message we send is always the peer PID. | |
308 DCHECK(message_reader_); | |
309 message_reader_->sender()->SetPeerPid(GetSelfPID()); | |
310 | |
311 if (flush) | 301 if (flush) |
312 Flush(); | 302 Flush(); |
313 } | 303 } |
314 | 304 |
315 void ChannelMojo::Flush() { | 305 void ChannelMojo::Flush() { |
316 bootstrap_->Flush(); | 306 bootstrap_->Flush(); |
317 } | 307 } |
318 | 308 |
319 void ChannelMojo::Close() { | 309 void ChannelMojo::Close() { |
320 // NOTE: The MessagePipeReader's destructor may re-enter this function. Use | 310 // NOTE: The MessagePipeReader's destructor may re-enter this function. Use |
321 // caution when changing this method. | 311 // caution when changing this method. |
322 std::unique_ptr<internal::MessagePipeReader> reader = | 312 std::unique_ptr<internal::MessagePipeReader> reader = |
323 std::move(message_reader_); | 313 std::move(message_reader_); |
324 reader.reset(); | 314 reader.reset(); |
325 | 315 |
326 base::AutoLock lock(associated_interface_lock_); | 316 base::AutoLock lock(associated_interface_lock_); |
327 associated_interfaces_.clear(); | 317 associated_interfaces_.clear(); |
328 } | 318 } |
329 | 319 |
330 // MojoBootstrap::Delegate implementation | 320 // MojoBootstrap::Delegate implementation |
331 void ChannelMojo::OnPipesAvailable(mojom::ChannelAssociatedPtr sender, | 321 void ChannelMojo::OnPipesAvailable(mojom::ChannelAssociatedPtr sender, |
332 mojom::ChannelAssociatedRequest receiver) { | 322 mojom::ChannelAssociatedRequest receiver) { |
| 323 sender->SetPeerPid(GetSelfPID()); |
333 message_reader_.reset(new internal::MessagePipeReader( | 324 message_reader_.reset(new internal::MessagePipeReader( |
334 pipe_, std::move(sender), std::move(receiver), this)); | 325 pipe_, std::move(sender), std::move(receiver), this)); |
335 } | 326 } |
336 | 327 |
337 void ChannelMojo::OnPipeError() { | 328 void ChannelMojo::OnPipeError() { |
338 DCHECK(task_runner_); | 329 DCHECK(task_runner_); |
339 if (task_runner_->RunsTasksOnCurrentThread()) { | 330 if (task_runner_->RunsTasksOnCurrentThread()) { |
340 listener_->OnChannelError(); | 331 listener_->OnChannelError(); |
341 } else { | 332 } else { |
342 task_runner_->PostTask( | 333 task_runner_->PostTask( |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 } | 495 } |
505 | 496 |
506 void ChannelMojo::GetGenericRemoteAssociatedInterface( | 497 void ChannelMojo::GetGenericRemoteAssociatedInterface( |
507 const std::string& name, | 498 const std::string& name, |
508 mojo::ScopedInterfaceEndpointHandle handle) { | 499 mojo::ScopedInterfaceEndpointHandle handle) { |
509 if (message_reader_) | 500 if (message_reader_) |
510 message_reader_->GetRemoteInterface(name, std::move(handle)); | 501 message_reader_->GetRemoteInterface(name, std::move(handle)); |
511 } | 502 } |
512 | 503 |
513 } // namespace IPC | 504 } // namespace IPC |
OLD | NEW |