| 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/slave_connection_manager.h" | 5 #include "mojo/edk/system/slave_connection_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 embedder::SlaveProcessDelegate* slave_process_delegate, | 41 embedder::SlaveProcessDelegate* slave_process_delegate, |
| 42 embedder::ScopedPlatformHandle platform_handle) { | 42 embedder::ScopedPlatformHandle platform_handle) { |
| 43 DCHECK(delegate_thread_task_runner); | 43 DCHECK(delegate_thread_task_runner); |
| 44 DCHECK(slave_process_delegate); | 44 DCHECK(slave_process_delegate); |
| 45 DCHECK(platform_handle.is_valid()); | 45 DCHECK(platform_handle.is_valid()); |
| 46 DCHECK(!delegate_thread_task_runner_); | 46 DCHECK(!delegate_thread_task_runner_); |
| 47 DCHECK(!slave_process_delegate_); | 47 DCHECK(!slave_process_delegate_); |
| 48 DCHECK(!private_thread_.message_loop()); | 48 DCHECK(!private_thread_.message_loop()); |
| 49 | 49 |
| 50 delegate_thread_task_runner_ = delegate_thread_task_runner; | 50 delegate_thread_task_runner_ = delegate_thread_task_runner; |
| 51 AssertOnDelegateThread(); | |
| 52 slave_process_delegate_ = slave_process_delegate; | 51 slave_process_delegate_ = slave_process_delegate; |
| 53 CHECK(private_thread_.StartWithOptions( | 52 CHECK(private_thread_.StartWithOptions( |
| 54 base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); | 53 base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); |
| 55 private_thread_.message_loop()->PostTask( | 54 private_thread_.message_loop()->PostTask( |
| 56 FROM_HERE, | 55 FROM_HERE, |
| 57 base::Bind(&SlaveConnectionManager::InitOnPrivateThread, | 56 base::Bind(&SlaveConnectionManager::InitOnPrivateThread, |
| 58 base::Unretained(this), base::Passed(&platform_handle))); | 57 base::Unretained(this), base::Passed(&platform_handle))); |
| 59 event_.Wait(); | 58 event_.Wait(); |
| 60 } | 59 } |
| 61 | 60 |
| 62 void SlaveConnectionManager::Shutdown() { | 61 void SlaveConnectionManager::Shutdown() { |
| 63 AssertOnDelegateThread(); | 62 AssertNotOnPrivateThread(); |
| 64 DCHECK(slave_process_delegate_); | 63 DCHECK(slave_process_delegate_); |
| 65 DCHECK(private_thread_.message_loop()); | 64 DCHECK(private_thread_.message_loop()); |
| 66 | 65 |
| 67 // The |Stop()| will actually finish all posted tasks. | 66 // The |Stop()| will actually finish all posted tasks. |
| 68 private_thread_.message_loop()->PostTask( | 67 private_thread_.message_loop()->PostTask( |
| 69 FROM_HERE, base::Bind(&SlaveConnectionManager::ShutdownOnPrivateThread, | 68 FROM_HERE, base::Bind(&SlaveConnectionManager::ShutdownOnPrivateThread, |
| 70 base::Unretained(this))); | 69 base::Unretained(this))); |
| 71 private_thread_.Stop(); | 70 private_thread_.Stop(); |
| 72 slave_process_delegate_ = nullptr; | 71 slave_process_delegate_ = nullptr; |
| 73 delegate_thread_task_runner_ = nullptr; | 72 delegate_thread_task_runner_ = nullptr; |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 | 286 |
| 288 raw_channel_->Shutdown(); | 287 raw_channel_->Shutdown(); |
| 289 raw_channel_.reset(); | 288 raw_channel_.reset(); |
| 290 | 289 |
| 291 DCHECK(slave_process_delegate_); | 290 DCHECK(slave_process_delegate_); |
| 292 delegate_thread_task_runner_->PostTask( | 291 delegate_thread_task_runner_->PostTask( |
| 293 FROM_HERE, base::Bind(&embedder::SlaveProcessDelegate::OnMasterDisconnect, | 292 FROM_HERE, base::Bind(&embedder::SlaveProcessDelegate::OnMasterDisconnect, |
| 294 base::Unretained(slave_process_delegate_))); | 293 base::Unretained(slave_process_delegate_))); |
| 295 } | 294 } |
| 296 | 295 |
| 297 void SlaveConnectionManager::AssertOnDelegateThread() const { | |
| 298 DCHECK(base::MessageLoop::current()); | |
| 299 DCHECK_EQ(base::MessageLoop::current()->task_runner(), | |
| 300 delegate_thread_task_runner_); | |
| 301 } | |
| 302 | |
| 303 void SlaveConnectionManager::AssertNotOnPrivateThread() const { | 296 void SlaveConnectionManager::AssertNotOnPrivateThread() const { |
| 304 // This should only be called after |Init()| and before |Shutdown()|. (If not, | 297 // This should only be called after |Init()| and before |Shutdown()|. (If not, |
| 305 // the subsequent |DCHECK_NE()| is invalid, since the current thread may not | 298 // the subsequent |DCHECK_NE()| is invalid, since the current thread may not |
| 306 // have a message loop.) | 299 // have a message loop.) |
| 307 DCHECK(private_thread_.message_loop()); | 300 DCHECK(private_thread_.message_loop()); |
| 308 DCHECK_NE(base::MessageLoop::current(), private_thread_.message_loop()); | 301 DCHECK_NE(base::MessageLoop::current(), private_thread_.message_loop()); |
| 309 } | 302 } |
| 310 | 303 |
| 311 void SlaveConnectionManager::AssertOnPrivateThread() const { | 304 void SlaveConnectionManager::AssertOnPrivateThread() const { |
| 312 // This should only be called after |Init()| and before |Shutdown()|. | 305 // This should only be called after |Init()| and before |Shutdown()|. |
| 313 DCHECK(private_thread_.message_loop()); | 306 DCHECK(private_thread_.message_loop()); |
| 314 DCHECK_EQ(base::MessageLoop::current(), private_thread_.message_loop()); | 307 DCHECK_EQ(base::MessageLoop::current(), private_thread_.message_loop()); |
| 315 } | 308 } |
| 316 | 309 |
| 317 } // namespace system | 310 } // namespace system |
| 318 } // namespace mojo | 311 } // namespace mojo |
| OLD | NEW |