Index: base/message_loop.h |
diff --git a/base/message_loop.h b/base/message_loop.h |
index c1dce433572a948521eafeba465170b844c263dd..9a1fdcd389c83a3ba34e2693dc3460af6ec5ce78 100644 |
--- a/base/message_loop.h |
+++ b/base/message_loop.h |
@@ -10,11 +10,14 @@ |
#include <string> |
#include "base/basictypes.h" |
+#include "base/callback.h" |
#include "base/message_pump.h" |
#include "base/observer_list.h" |
#include "base/ref_counted.h" |
#include "base/synchronization/lock.h" |
#include "base/task.h" |
+#include "base/time.h" |
+#include "base/tracked.h" |
#if defined(OS_WIN) |
// We need this to declare base::MessagePumpWin::Dispatcher, which we should |
@@ -35,6 +38,12 @@ namespace base { |
class Histogram; |
} |
+#if defined(TRACK_ALL_TASK_OBJECTS) |
+namespace tracked_objects { |
+class Births; |
+} |
+#endif // defined(TRACK_ALL_TASK_OBJECTS) |
+ |
// A MessageLoop is used to process events for a particular thread. There is |
// at most one MessageLoop instance per thread. |
// |
@@ -162,6 +171,22 @@ class MessageLoop : public base::MessagePump::Delegate { |
void PostNonNestableDelayedTask( |
const tracked_objects::Location& from_here, Task* task, int64 delay_ms); |
+ void PostClosure( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& closure); |
+ |
+ void PostDelayedClosure( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& closure, int64 delay_ms); |
+ |
+ void PostNonNestableClosure( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& closure); |
+ |
+ void PostNonNestableDelayedClosure( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& closure, int64 delay_ms); |
+ |
// A variant on PostTask that deletes the given object. This is useful |
// if the object needs to live until the next run of the MessageLoop (for |
// example, deleting a RenderProcessHost from within an IPC callback is not |
@@ -279,28 +304,28 @@ class MessageLoop : public base::MessagePump::Delegate { |
// Returns true if we are currently running a nested message loop. |
bool IsNested(); |
- // A TaskObserver is an object that receives task notifications from the |
+ // A ClosureObserver is an object that receives task notifications from the |
// MessageLoop. |
// |
- // NOTE: A TaskObserver implementation should be extremely fast! |
- class TaskObserver { |
+ // NOTE: A ClosureObserver implementation should be extremely fast! |
+ class ClosureObserver { |
public: |
- TaskObserver(); |
+ ClosureObserver(); |
// This method is called before processing a task. |
- virtual void WillProcessTask(const Task* task) = 0; |
+ virtual void WillProcessClosure(base::TimeTicks time_posted) = 0; |
// This method is called after processing a task. |
- virtual void DidProcessTask(const Task* task) = 0; |
+ virtual void DidProcessClosure(base::TimeTicks time_posted) = 0; |
protected: |
- virtual ~TaskObserver(); |
+ virtual ~ClosureObserver(); |
}; |
// These functions can only be called on the same thread that |this| is |
// running on. |
- void AddTaskObserver(TaskObserver* task_observer); |
- void RemoveTaskObserver(TaskObserver* task_observer); |
+ void AddClosureObserver(ClosureObserver* closure_observer); |
+ void RemoveClosureObserver(ClosureObserver* closure_observer); |
// Returns true if the message loop has high resolution timers enabled. |
// Provided for testing. |
@@ -344,28 +369,44 @@ class MessageLoop : public base::MessagePump::Delegate { |
}; |
// This structure is copied around by value. |
- struct PendingTask { |
- PendingTask(Task* task, bool nestable) |
- : task(task), sequence_num(0), nestable(nestable) { |
- } |
+ struct PendingClosure { |
+ PendingClosure(const base::Closure& closure, |
+ const tracked_objects::Location& posted_from, |
+ base::TimeTicks delayed_run_time, |
+ bool nestable); |
// Used to support sorting. |
- bool operator<(const PendingTask& other) const; |
+ bool operator<(const PendingClosure& other) const; |
- Task* task; // The task to run. |
- base::TimeTicks delayed_run_time; // The time when the task should be run. |
- int sequence_num; // Secondary sort key for run time. |
- bool nestable; // OK to dispatch from a nested loop. |
+ // The Closure to run. |
+ base::Closure closure; |
+ |
+#if defined(TRACK_ALL_TASK_OBJECTS) |
+ // Counter for location where the Closure was posted from. |
+ tracked_objects::Births* post_births; |
+#endif // defined(TRACK_ALL_TASK_OBJECTS) |
+ |
+ // Time this PendingClosure was posted. |
+ base::TimeTicks time_posted; |
+ |
+ // The time when the task should be run. |
+ base::TimeTicks delayed_run_time; |
+ |
+ // Secondary sort key for run time. |
+ int sequence_num; |
+ |
+ // OK to dispatch from a nested loop. |
+ bool nestable; |
}; |
- class TaskQueue : public std::queue<PendingTask> { |
+ class TaskQueue : public std::queue<PendingClosure> { |
public: |
void Swap(TaskQueue* queue) { |
c.swap(queue->c); // Calls std::deque::swap |
} |
}; |
- typedef std::priority_queue<PendingTask> DelayedTaskQueue; |
+ typedef std::priority_queue<PendingClosure> DelayedTaskQueue; |
#if defined(OS_WIN) |
base::MessagePumpWin* pump_win() { |
@@ -395,15 +436,20 @@ class MessageLoop : public base::MessagePump::Delegate { |
// Called to process any delayed non-nestable tasks. |
bool ProcessNextDelayedNonNestableTask(); |
- // Runs the specified task and deletes it. |
- void RunTask(Task* task); |
+ // Runs the specified PendingClosure. |
+ void RunClosure(const PendingClosure& closure); |
- // Calls RunTask or queues the pending_task on the deferred task list if it |
+ // Calls RunTask or queues the pending_closure on the deferred task list if it |
// cannot be run right now. Returns true if the task was run. |
- bool DeferOrRunPendingTask(const PendingTask& pending_task); |
+ bool DeferOrRunPendingClosure(const PendingClosure& pending_closure); |
// Adds the pending task to delayed_work_queue_. |
- void AddToDelayedWorkQueue(const PendingTask& pending_task); |
+ void AddToDelayedWorkQueue(const PendingClosure& pending_closure); |
+ |
+ // Adds the pending task to our incoming_queue_. |
+ // Caller retains ownership of |pending_closure|, but this function will |
+ // reset the value of pending_closure->closure. |
+ void AddToIncomingQueue(PendingClosure* pending_closure); |
// Load tasks from the incoming_queue_ into work_queue_ if the latter is |
// empty. The former requires a lock to access, while the latter is directly |
@@ -413,11 +459,10 @@ class MessageLoop : public base::MessagePump::Delegate { |
// Delete tasks that haven't run yet without running them. Used in the |
// destructor to make sure all the task's destructors get called. Returns |
// true if some work was done. |
- bool DeletePendingTasks(); |
+ bool DeletePendingClosures(); |
- // Post a task to our incomming queue. |
- void PostTask_Helper(const tracked_objects::Location& from_here, Task* task, |
- int64 delay_ms, bool nestable); |
+ // Calcuates the time at which a PendingClosure should run. |
+ base::TimeTicks CalculateDelayedRuntime(int64 delay_ms); |
// Start recording histogram info about events and action IF it was enabled |
// and IF the statistics recorder can accept a registration of our histogram. |
@@ -466,14 +511,16 @@ class MessageLoop : public base::MessagePump::Delegate { |
// A null terminated list which creates an incoming_queue of tasks that are |
// acquired under a mutex for processing on this instance's thread. These |
- // tasks have not yet been sorted out into items for our work_queue_ vs |
- // items that will be handled by the TimerManager. |
+ // tasks have not yet been sorted out into items for our work_queue_ vs items |
+ // that will be handled by the TimerManager. |
TaskQueue incoming_queue_; |
// Protect access to incoming_queue_. |
mutable base::Lock incoming_queue_lock_; |
RunState* state_; |
+ bool should_leak_tasks_; |
+ |
#if defined(OS_WIN) |
base::TimeTicks high_resolution_timer_expiration_; |
#endif |
@@ -481,7 +528,7 @@ class MessageLoop : public base::MessagePump::Delegate { |
// The next sequence number to use for delayed tasks. |
int next_sequence_num_; |
- ObserverList<TaskObserver> task_observers_; |
+ ObserverList<ClosureObserver> closure_observers_; |
DISALLOW_COPY_AND_ASSIGN(MessageLoop); |
}; |