| // Copyright (c) 2011 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 "media/base/message_loop_factory_impl.h" |
| |
| namespace media { |
| |
| MessageLoopFactoryImpl::MessageLoopFactoryImpl() {} |
| |
| MessageLoopFactoryImpl::~MessageLoopFactoryImpl() { |
| base::AutoLock auto_lock(lock_); |
| |
| for (ThreadMap::iterator iter = thread_map_.begin(); |
| iter != thread_map_.end(); |
| ++iter) { |
| base::Thread* thread = (*iter).second; |
| |
| if (thread) { |
| thread->Stop(); |
| delete thread; |
| } |
| } |
| thread_map_.clear(); |
| } |
| |
| // MessageLoopFactory methods. |
| MessageLoop* MessageLoopFactoryImpl::GetMessageLoop(const std::string& name) { |
| if (name.empty()) { |
| return NULL; |
| } |
| |
| base::AutoLock auto_lock(lock_); |
| |
| ThreadMap::iterator it = thread_map_.find(name); |
| if (it != thread_map_.end()) |
| return (*it).second->message_loop(); |
| |
| scoped_ptr<base::Thread> thread(new base::Thread(name.c_str())); |
| |
| if (thread->Start()) { |
| MessageLoop* message_loop = thread->message_loop(); |
| thread_map_[name] = thread.release(); |
| return message_loop; |
| } |
| |
| LOG(ERROR) << "Failed to start '" << name << "' thread!"; |
| return NULL; |
| } |
| |
| scoped_refptr<base::MessageLoopProxy> |
| MessageLoopFactoryImpl::GetMessageLoopProxy(const std::string& name) { |
| if (name.empty()) { |
| return NULL; |
| } |
| |
| base::AutoLock auto_lock(lock_); |
| |
| ThreadMap::iterator it = thread_map_.find(name); |
| if (it != thread_map_.end()) |
| return (*it).second->message_loop_proxy(); |
| |
| scoped_ptr<base::Thread> thread(new base::Thread(name.c_str())); |
| |
| if (thread->Start()) { |
| scoped_refptr<base::MessageLoopProxy> message_loop_proxy = |
| thread->message_loop_proxy(); |
| thread_map_[name] = thread.release(); |
| return message_loop_proxy; |
| } |
| |
| LOG(ERROR) << "Failed to start '" << name << "' thread!"; |
| return NULL; |
| } |
| |
| } // namespace media |