Index: base/message_loop/message_loop_proxy_impl.cc |
diff --git a/base/message_loop/message_loop_proxy_impl.cc b/base/message_loop/message_loop_proxy_impl.cc |
index 7dc8caa9f4c047f93cf7366c2e373ad1eebdd0fb..38cc10426604d2ec1ca2c7d63cdd83840bec69c7 100644 |
--- a/base/message_loop/message_loop_proxy_impl.cc |
+++ b/base/message_loop/message_loop_proxy_impl.cc |
@@ -16,14 +16,16 @@ bool MessageLoopProxyImpl::PostDelayedTask( |
const tracked_objects::Location& from_here, |
const base::Closure& task, |
base::TimeDelta delay) { |
- return PostTaskHelper(from_here, task, delay, true); |
+ DCHECK(!task.is_null()) << from_here.ToString(); |
+ return AddToIncomingQueue(from_here, task, delay, true); |
} |
bool MessageLoopProxyImpl::PostNonNestableDelayedTask( |
const tracked_objects::Location& from_here, |
const base::Closure& task, |
base::TimeDelta delay) { |
- return PostTaskHelper(from_here, task, delay, false); |
+ DCHECK(!task.is_null()) << from_here.ToString(); |
+ return AddToIncomingQueue(from_here, task, delay, false); |
} |
bool MessageLoopProxyImpl::RunsTasksOnCurrentThread() const { |
@@ -66,18 +68,40 @@ MessageLoopProxyImpl::MessageLoopProxyImpl() |
: target_message_loop_(MessageLoop::current()) { |
} |
-bool MessageLoopProxyImpl::PostTaskHelper( |
- const tracked_objects::Location& from_here, const base::Closure& task, |
- base::TimeDelta delay, bool nestable) { |
- AutoLock lock(message_loop_lock_); |
- if (target_message_loop_) { |
- if (nestable) { |
- target_message_loop_->PostDelayedTask(from_here, task, delay); |
- } else { |
- target_message_loop_->PostNonNestableDelayedTask(from_here, task, delay); |
+bool MessageLoopProxyImpl::AddToIncomingQueue( |
+ const tracked_objects::Location& from_here, |
+ const Closure& task, |
+ TimeDelta delay, |
+ bool nestable) { |
+ AutoLock locked(message_loop_lock_); |
+ if (!target_message_loop_) { |
+ // Reset |task|. |
+ Closure reset_task = task; |
+ return false; |
+ } |
+ |
+ target_message_loop_->AddToIncomingQueue(from_here, task, delay, nestable); |
+ return true; |
+} |
+ |
+bool MessageLoopProxyImpl::TryAddToIncomingQueue( |
+ const tracked_objects::Location& from_here, |
+ const Closure& task) { |
+ if (message_loop_lock_.Try()) { |
+ AutoLock locked(message_loop_lock_, AutoLock::AlreadyAcquired()); |
+ if (!target_message_loop_) { |
+ // Reset |task|. |
+ Closure reset_task = task; |
+ return false; |
} |
+ |
+ target_message_loop_->AddToIncomingQueue(from_here, task, TimeDelta(), |
+ true); |
return true; |
} |
+ |
+ // Reset |task|. |
+ Closure reset_task = task; |
return false; |
} |