Index: third_party/mojo/src/mojo/edk/system/master_connection_manager.cc |
diff --git a/third_party/mojo/src/mojo/edk/system/master_connection_manager.cc b/third_party/mojo/src/mojo/edk/system/master_connection_manager.cc |
index b401bcd24a338203ca6684fcd71b1d044c6105c3..e98908dc0713406395a6ec7b01a5a483dd7b2494 100644 |
--- a/third_party/mojo/src/mojo/edk/system/master_connection_manager.cc |
+++ b/third_party/mojo/src/mojo/edk/system/master_connection_manager.cc |
@@ -37,12 +37,12 @@ class MasterConnectionManager::Helper : public RawChannel::Delegate { |
public: |
Helper(MasterConnectionManager* owner, |
ProcessIdentifier process_identifier, |
- scoped_ptr<embedder::SlaveInfo> slave_info, |
+ embedder::SlaveInfo slave_info, |
embedder::ScopedPlatformHandle platform_handle); |
~Helper() override; |
void Init(); |
- scoped_ptr<embedder::SlaveInfo> Shutdown(); |
+ embedder::SlaveInfo Shutdown(); |
private: |
// |RawChannel::Delegate| methods: |
@@ -58,7 +58,7 @@ class MasterConnectionManager::Helper : public RawChannel::Delegate { |
MasterConnectionManager* const owner_; |
const ProcessIdentifier process_identifier_; |
- scoped_ptr<embedder::SlaveInfo> slave_info_; |
+ embedder::SlaveInfo const slave_info_; |
scoped_ptr<RawChannel> raw_channel_; |
DISALLOW_COPY_AND_ASSIGN(Helper); |
@@ -67,26 +67,26 @@ class MasterConnectionManager::Helper : public RawChannel::Delegate { |
MasterConnectionManager::Helper::Helper( |
MasterConnectionManager* owner, |
ProcessIdentifier process_identifier, |
- scoped_ptr<embedder::SlaveInfo> slave_info, |
+ embedder::SlaveInfo slave_info, |
embedder::ScopedPlatformHandle platform_handle) |
: owner_(owner), |
process_identifier_(process_identifier), |
- slave_info_(slave_info.Pass()), |
+ slave_info_(slave_info), |
raw_channel_(RawChannel::Create(platform_handle.Pass())) { |
} |
MasterConnectionManager::Helper::~Helper() { |
- DCHECK(!slave_info_); |
+ DCHECK(!raw_channel_); |
} |
void MasterConnectionManager::Helper::Init() { |
raw_channel_->Init(this); |
} |
-scoped_ptr<embedder::SlaveInfo> MasterConnectionManager::Helper::Shutdown() { |
+embedder::SlaveInfo MasterConnectionManager::Helper::Shutdown() { |
raw_channel_->Shutdown(); |
raw_channel_.reset(); |
- return slave_info_.Pass(); |
+ return slave_info_; |
} |
void MasterConnectionManager::Helper::OnReadMessage( |
@@ -243,30 +243,13 @@ void MasterConnectionManager::Init( |
DCHECK(!private_thread_.message_loop()); |
delegate_thread_task_runner_ = delegate_thread_task_runner; |
- AssertOnDelegateThread(); |
master_process_delegate_ = master_process_delegate; |
CHECK(private_thread_.StartWithOptions( |
base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); |
} |
-void MasterConnectionManager::Shutdown() { |
- AssertOnDelegateThread(); |
- DCHECK(master_process_delegate_); |
- DCHECK(private_thread_.message_loop()); |
- |
- // The |Stop()| will actually finish all posted tasks. |
- private_thread_.message_loop()->PostTask( |
- FROM_HERE, base::Bind(&MasterConnectionManager::ShutdownOnPrivateThread, |
- base::Unretained(this))); |
- private_thread_.Stop(); |
- DCHECK(helpers_.empty()); |
- DCHECK(pending_connections_.empty()); |
- master_process_delegate_ = nullptr; |
- delegate_thread_task_runner_ = nullptr; |
-} |
- |
void MasterConnectionManager::AddSlave( |
- scoped_ptr<embedder::SlaveInfo> slave_info, |
+ embedder::SlaveInfo slave_info, |
embedder::ScopedPlatformHandle platform_handle) { |
// We don't really care if |slave_info| is non-null or not. |
DCHECK(platform_handle.is_valid()); |
@@ -278,11 +261,27 @@ void MasterConnectionManager::AddSlave( |
private_thread_.message_loop()->PostTask( |
FROM_HERE, |
base::Bind(&MasterConnectionManager::AddSlaveOnPrivateThread, |
- base::Unretained(this), base::Passed(&slave_info), |
+ base::Unretained(this), base::Unretained(slave_info), |
base::Passed(&platform_handle), base::Unretained(&event))); |
event.Wait(); |
} |
+void MasterConnectionManager::Shutdown() { |
+ AssertNotOnPrivateThread(); |
+ DCHECK(master_process_delegate_); |
+ DCHECK(private_thread_.message_loop()); |
+ |
+ // The |Stop()| will actually finish all posted tasks. |
+ private_thread_.message_loop()->PostTask( |
+ FROM_HERE, base::Bind(&MasterConnectionManager::ShutdownOnPrivateThread, |
+ base::Unretained(this))); |
+ private_thread_.Stop(); |
+ DCHECK(helpers_.empty()); |
+ DCHECK(pending_connections_.empty()); |
+ master_process_delegate_ = nullptr; |
+ delegate_thread_task_runner_ = nullptr; |
+} |
+ |
bool MasterConnectionManager::AllowConnect( |
const ConnectionIdentifier& connection_id) { |
AssertNotOnPrivateThread(); |
@@ -482,16 +481,16 @@ void MasterConnectionManager::ShutdownOnPrivateThread() { |
if (!helpers_.empty()) { |
DVLOG(1) << "Shutting down with slaves still connected"; |
for (auto& p : helpers_) { |
- scoped_ptr<embedder::SlaveInfo> slave_info = p.second->Shutdown(); |
+ embedder::SlaveInfo slave_info = p.second->Shutdown(); |
delete p.second; |
- CallOnSlaveDisconnect(slave_info.Pass()); |
+ CallOnSlaveDisconnect(slave_info); |
} |
helpers_.clear(); |
} |
} |
void MasterConnectionManager::AddSlaveOnPrivateThread( |
- scoped_ptr<embedder::SlaveInfo> slave_info, |
+ embedder::SlaveInfo slave_info, |
embedder::ScopedPlatformHandle platform_handle, |
base::WaitableEvent* event) { |
DCHECK(platform_handle.is_valid()); |
@@ -502,8 +501,8 @@ void MasterConnectionManager::AddSlaveOnPrivateThread( |
ProcessIdentifier process_identifier = next_process_identifier_; |
next_process_identifier_++; |
- scoped_ptr<Helper> helper(new Helper( |
- this, process_identifier, slave_info.Pass(), platform_handle.Pass())); |
+ scoped_ptr<Helper> helper( |
+ new Helper(this, process_identifier, slave_info, platform_handle.Pass())); |
helper->Init(); |
DCHECK(helpers_.find(process_identifier) == helpers_.end()); |
@@ -520,7 +519,7 @@ void MasterConnectionManager::OnError(ProcessIdentifier process_identifier) { |
auto it = helpers_.find(process_identifier); |
DCHECK(it != helpers_.end()); |
Helper* helper = it->second; |
- scoped_ptr<embedder::SlaveInfo> slave_info = helper->Shutdown(); |
+ embedder::SlaveInfo slave_info = helper->Shutdown(); |
helpers_.erase(it); |
delete helper; |
@@ -542,23 +541,17 @@ void MasterConnectionManager::OnError(ProcessIdentifier process_identifier) { |
} |
} |
- CallOnSlaveDisconnect(slave_info.Pass()); |
+ CallOnSlaveDisconnect(slave_info); |
} |
void MasterConnectionManager::CallOnSlaveDisconnect( |
- scoped_ptr<embedder::SlaveInfo> slave_info) { |
+ embedder::SlaveInfo slave_info) { |
AssertOnPrivateThread(); |
DCHECK(master_process_delegate_); |
delegate_thread_task_runner_->PostTask( |
FROM_HERE, base::Bind(&embedder::MasterProcessDelegate::OnSlaveDisconnect, |
base::Unretained(master_process_delegate_), |
- base::Passed(&slave_info))); |
-} |
- |
-void MasterConnectionManager::AssertOnDelegateThread() const { |
- DCHECK(base::MessageLoop::current()); |
- DCHECK_EQ(base::MessageLoop::current()->task_runner(), |
- delegate_thread_task_runner_); |
+ base::Unretained(slave_info))); |
} |
void MasterConnectionManager::AssertNotOnPrivateThread() const { |