Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Unified Diff: base/message_loop.cc

Issue 14387002: Adding TryPostTask to the message loop (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix bool Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/message_loop.cc
diff --git a/base/message_loop.cc b/base/message_loop.cc
index c84c493a661fc75df4abf953fd618c3de74aed34..f94225165cf0a864a94f38b6c3ee690184d046ed 100644
--- a/base/message_loop.cc
+++ b/base/message_loop.cc
@@ -274,7 +274,15 @@ void MessageLoop::PostTask(
DCHECK(!task.is_null()) << from_here.ToString();
PendingTask pending_task(
from_here, task, CalculateDelayedRuntime(TimeDelta()), true);
- AddToIncomingQueue(&pending_task);
+ AddToIncomingQueue(&pending_task, false);
+}
+
+bool MessageLoop::TryPostTask(
+ const tracked_objects::Location& from_here, const Closure& task) {
jar (doing other things) 2013/04/26 21:59:43 nit: one arg per line if you need to wrap. You co
+ DCHECK(!task.is_null()) << from_here.ToString();
+ PendingTask pending_task(
+ from_here, task, CalculateDelayedRuntime(TimeDelta()), true);
+ return AddToIncomingQueue(&pending_task, true);
}
void MessageLoop::PostDelayedTask(
@@ -284,7 +292,7 @@ void MessageLoop::PostDelayedTask(
DCHECK(!task.is_null()) << from_here.ToString();
PendingTask pending_task(
from_here, task, CalculateDelayedRuntime(delay), true);
- AddToIncomingQueue(&pending_task);
+ AddToIncomingQueue(&pending_task, false);
}
void MessageLoop::PostNonNestableTask(
@@ -293,7 +301,7 @@ void MessageLoop::PostNonNestableTask(
DCHECK(!task.is_null()) << from_here.ToString();
PendingTask pending_task(
from_here, task, CalculateDelayedRuntime(TimeDelta()), false);
- AddToIncomingQueue(&pending_task);
+ AddToIncomingQueue(&pending_task, false);
}
void MessageLoop::PostNonNestableDelayedTask(
@@ -303,7 +311,7 @@ void MessageLoop::PostNonNestableDelayedTask(
DCHECK(!task.is_null()) << from_here.ToString();
PendingTask pending_task(
from_here, task, CalculateDelayedRuntime(delay), false);
- AddToIncomingQueue(&pending_task);
+ AddToIncomingQueue(&pending_task, false);
}
void MessageLoop::Run() {
@@ -586,15 +594,23 @@ TimeTicks MessageLoop::CalculateDelayedRuntime(TimeDelta delay) {
}
// Possibly called on a background thread!
-void MessageLoop::AddToIncomingQueue(PendingTask* pending_task) {
+bool MessageLoop::AddToIncomingQueue(PendingTask* pending_task,
+ bool use_try_lock) {
// Warning: Don't try to short-circuit, and handle this thread's tasks more
// directly, as it could starve handling of foreign threads. Put every task
// into this queue.
scoped_refptr<MessagePump> pump;
{
- AutoLock locked(incoming_queue_lock_);
-
+ if (use_try_lock) {
+ if (!incoming_queue_lock_.Try()) {
+ pending_task->task.Reset();
+ return false;
+ }
+ } else {
+ incoming_queue_lock_.Acquire();
+ }
+ AutoLock locked(incoming_queue_lock_, AutoLock::NoAcquire());
jar (doing other things) 2013/04/21 15:29:35 Interesting API. Did you consider having a second
cpu_(ooo_6.6-7.5) 2013/04/22 23:30:59 Yeah, the main drawback is having to add state to
// Initialize the sequence number. The sequence number is used for delayed
// tasks (to faciliate FIFO sorting when two tasks have the same
// delayed_run_time value) and for identifying the task in about:tracing.
@@ -607,7 +623,7 @@ void MessageLoop::AddToIncomingQueue(PendingTask* pending_task) {
incoming_queue_.push(*pending_task);
pending_task->task.Reset();
if (!was_empty)
- return; // Someone else should have started the sub-pump.
+ return true; // Someone else should have started the sub-pump.
pump = pump_;
}
@@ -617,6 +633,7 @@ void MessageLoop::AddToIncomingQueue(PendingTask* pending_task) {
// ScheduleWork outside of incoming_queue_lock_.
pump->ScheduleWork();
+ return true;
}
//------------------------------------------------------------------------------

Powered by Google App Engine
This is Rietveld 408576698