| Index: mojo/edk/system/channel_manager.cc
|
| diff --git a/mojo/edk/system/channel_manager.cc b/mojo/edk/system/channel_manager.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e673299cb6c1b785791451ca5282f20ae14b56ac
|
| --- /dev/null
|
| +++ b/mojo/edk/system/channel_manager.cc
|
| @@ -0,0 +1,62 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "mojo/edk/system/channel_manager.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/location.h"
|
| +
|
| +namespace mojo {
|
| +namespace system {
|
| +
|
| +namespace {
|
| +
|
| +void ShutdownChannelHelper(const ChannelInfo& channel_info) {
|
| + channel_info.channel->WillShutdownSoon();
|
| + channel_info.channel_thread_task_runner->PostTask(
|
| + FROM_HERE, base::Bind(&Channel::Shutdown, channel_info.channel));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +ChannelManager::ChannelManager() {
|
| +}
|
| +
|
| +ChannelManager::~ChannelManager() {
|
| + // No need to take the lock.
|
| + for (const auto& map_elem : channel_infos_)
|
| + ShutdownChannelHelper(map_elem.second);
|
| +}
|
| +
|
| +ChannelId ChannelManager::AddChannel(
|
| + scoped_refptr<Channel> channel,
|
| + scoped_refptr<base::TaskRunner> channel_thread_task_runner) {
|
| + ChannelId channel_id = GetChannelId(channel.get());
|
| +
|
| + {
|
| + base::AutoLock locker(lock_);
|
| + DCHECK(channel_infos_.find(channel_id) == channel_infos_.end());
|
| + channel_infos_[channel_id] =
|
| + ChannelInfo(channel, channel_thread_task_runner);
|
| + }
|
| + channel->SetChannelManager(this);
|
| +
|
| + return channel_id;
|
| +}
|
| +
|
| +void ChannelManager::ShutdownChannel(ChannelId channel_id) {
|
| + ChannelInfo channel_info;
|
| + {
|
| + base::AutoLock locker(lock_);
|
| +
|
| + auto it = channel_infos_.find(channel_id);
|
| + DCHECK(it != channel_infos_.end());
|
| + channel_info.Swap(&it->second);
|
| + channel_infos_.erase(it);
|
| + }
|
| + ShutdownChannelHelper(channel_info);
|
| +}
|
| +
|
| +} // namespace system
|
| +} // namespace mojo
|
|
|