diff options
author | sanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-06 18:34:24 +0000 |
---|---|---|
committer | sanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-06 18:34:24 +0000 |
commit | 656475d275524893e4e9b1f02469fe470721a14e (patch) | |
tree | 76198770e24f0bea147c10a50ae2a3bf9c7f7274 /base/message_loop_proxy_impl.cc | |
parent | 7e19edf7255b366b5e4b9b0bb77caf9842a37f1b (diff) | |
download | chromium_src-656475d275524893e4e9b1f02469fe470721a14e.zip chromium_src-656475d275524893e4e9b1f02469fe470721a14e.tar.gz chromium_src-656475d275524893e4e9b1f02469fe470721a14e.tar.bz2 |
Created a stock implementation of the MessageLoopProxy interface than can be used to create an implementation that targets the current thread's message loop.
BUG=None
TEST=Unit tests provided.
Review URL: http://codereview.chromium.org/1837003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@46591 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/message_loop_proxy_impl.cc')
-rw-r--r-- | base/message_loop_proxy_impl.cc | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/base/message_loop_proxy_impl.cc b/base/message_loop_proxy_impl.cc new file mode 100644 index 0000000..983a406 --- /dev/null +++ b/base/message_loop_proxy_impl.cc @@ -0,0 +1,101 @@ +// Copyright (c) 2010 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 "base/message_loop_proxy_impl.h" + +namespace base { + +MessageLoopProxyImpl::MessageLoopProxyImpl() + : target_message_loop_(MessageLoop::current()) { + target_message_loop_->AddDestructionObserver(this); +} + +MessageLoopProxyImpl::~MessageLoopProxyImpl() { + AutoLock lock(message_loop_lock_); + // If the target message loop still exists, the d'tor WILL execute on the + // target loop. + if (target_message_loop_) { + DCHECK(MessageLoop::current() == target_message_loop_); + MessageLoop::current()->RemoveDestructionObserver(this); + } +} + + // MessageLoopProxy implementation +bool MessageLoopProxyImpl::PostTask(const tracked_objects::Location& from_here, + Task* task) { + return PostTaskHelper(from_here, task, 0, true); +} + +bool MessageLoopProxyImpl::PostDelayedTask( + const tracked_objects::Location& from_here, Task* task, int64 delay_ms) { + return PostTaskHelper(from_here, task, delay_ms, true); +} + +bool MessageLoopProxyImpl::PostNonNestableTask( + const tracked_objects::Location& from_here, Task* task) { + return PostTaskHelper(from_here, task, 0, false); +} + +bool MessageLoopProxyImpl::PostNonNestableDelayedTask( + const tracked_objects::Location& from_here, + Task* task, + int64 delay_ms) { + return PostTaskHelper(from_here, task, delay_ms, false); +} + +bool MessageLoopProxyImpl::BelongsToCurrentThread() { + AutoLock lock(message_loop_lock_); + return (target_message_loop_ && + (MessageLoop::current() == target_message_loop_)); +} + +bool MessageLoopProxyImpl::PostTaskHelper( + const tracked_objects::Location& from_here, Task* task, int64 delay_ms, + bool nestable) { + bool ret = false; + { + AutoLock lock(message_loop_lock_); + if (target_message_loop_) { + if (nestable) { + target_message_loop_->PostDelayedTask(from_here, task, delay_ms); + } else { + target_message_loop_->PostNonNestableDelayedTask(from_here, task, + delay_ms); + } + ret = true; + } + } + if (!ret) + delete task; + return ret; +} + +void MessageLoopProxyImpl::OnDestruct() { + bool delete_later = false; + { + AutoLock lock(message_loop_lock_); + if (target_message_loop_ && + (MessageLoop::current() != target_message_loop_)) { + target_message_loop_->DeleteSoon(FROM_HERE, this); + delete_later = true; + } + } + if (!delete_later) + delete this; +} + +// MessageLoop::DestructionObserver implementation +void MessageLoopProxyImpl::WillDestroyCurrentMessageLoop() { + AutoLock lock(message_loop_lock_); + target_message_loop_ = NULL; +} + +scoped_refptr<MessageLoopProxy> +MessageLoopProxy::CreateForCurrentThread() { + scoped_refptr<MessageLoopProxy> ret = new MessageLoopProxyImpl(); + return ret; +} + +} // namespace base + |