Index: base/message_loop.h |
diff --git a/base/message_loop.h b/base/message_loop.h |
index 1a04323570f11483b4a40b525668d344b76491de..8b4be7c9624f2c35a98a49efe4938bc084f04794 100644 |
--- a/base/message_loop.h |
+++ b/base/message_loop.h |
@@ -8,6 +8,7 @@ |
#include <queue> |
#include <string> |
+#include "base/basictypes.h" |
#include "base/histogram.h" |
#include "base/message_pump.h" |
#include "base/observer_list.h" |
@@ -58,6 +59,24 @@ |
// |
class MessageLoop : public base::MessagePump::Delegate { |
public: |
+ // A TaskObserver is an object that receives task notifications from the |
+ // MessageLoop. |
+ // |
+ // NOTE: A TaskObserver implementation should be extremely fast! |
+ class TaskObserver { |
+ public: |
+ TaskObserver() {} |
+ |
+ // This method is called before processing a task. |
+ virtual void WillProcessTask(base::TimeTicks birth_time) = 0; |
+ |
+ // This method is called after processing a task. |
+ virtual void DidProcessTask() = 0; |
+ |
+ protected: |
+ virtual ~TaskObserver() {} |
+ }; |
+ |
static void EnableHistogrammer(bool enable_histogrammer); |
// A DestructionObserver is notified when the current MessageLoop is being |
@@ -255,9 +274,14 @@ class MessageLoop : public base::MessagePump::Delegate { |
// Returns true if we are currently running a nested message loop. |
bool IsNested(); |
+ // 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); |
+ |
#if defined(OS_WIN) |
typedef base::MessagePumpWin::Dispatcher Dispatcher; |
- typedef base::MessagePumpWin::Observer Observer; |
+ typedef base::MessagePumpForUI::Observer Observer; |
#elif !defined(OS_MACOSX) |
typedef base::MessagePumpForUI::Dispatcher Dispatcher; |
typedef base::MessagePumpForUI::Observer Observer; |
@@ -433,6 +457,8 @@ class MessageLoop : public base::MessagePump::Delegate { |
// The next sequence number to use for delayed tasks. |
int next_sequence_num_; |
+ ObserverList<TaskObserver> task_observers_; |
+ |
DISALLOW_COPY_AND_ASSIGN(MessageLoop); |
}; |
@@ -456,10 +482,8 @@ class MessageLoopForUI : public MessageLoop { |
} |
#if defined(OS_WIN) |
- void WillProcessMessage(const MSG& message); |
void DidProcessMessage(const MSG& message); |
- void PumpOutPendingPaintMessages(); |
-#endif |
+#endif // defined(OS_WIN) |
#if !defined(OS_MACOSX) |
// Please see message_pump_win/message_pump_glib for definitions of these |
@@ -473,7 +497,7 @@ class MessageLoopForUI : public MessageLoop { |
base::MessagePumpForUI* pump_ui() { |
return static_cast<base::MessagePumpForUI*>(pump_.get()); |
} |
-#endif // defined(OS_MACOSX) |
+#endif // !defined(OS_MACOSX) |
}; |
// Do not add any member variables to MessageLoopForUI! This is important b/c |
@@ -491,6 +515,24 @@ COMPILE_ASSERT(sizeof(MessageLoop) == sizeof(MessageLoopForUI), |
// |
class MessageLoopForIO : public MessageLoop { |
public: |
+#if defined(OS_WIN) |
+ typedef base::MessagePumpForIO::IOHandler IOHandler; |
+ typedef base::MessagePumpForIO::IOContext IOContext; |
+ typedef base::MessagePumpForIO::IOObserver IOObserver; |
+#elif defined(OS_POSIX) |
+ typedef base::MessagePumpLibevent::Watcher Watcher; |
+ typedef base::MessagePumpLibevent::FileDescriptorWatcher |
+ FileDescriptorWatcher; |
+ typedef base::MessagePumpLibevent::IOObserver IOObserver; |
+ |
+ enum Mode { |
+ WATCH_READ = base::MessagePumpLibevent::WATCH_READ, |
+ WATCH_WRITE = base::MessagePumpLibevent::WATCH_WRITE, |
+ WATCH_READ_WRITE = base::MessagePumpLibevent::WATCH_READ_WRITE |
+ }; |
+ |
+#endif |
+ |
MessageLoopForIO() : MessageLoop(TYPE_IO) { |
} |
@@ -501,10 +543,15 @@ class MessageLoopForIO : public MessageLoop { |
return static_cast<MessageLoopForIO*>(loop); |
} |
-#if defined(OS_WIN) |
- typedef base::MessagePumpForIO::IOHandler IOHandler; |
- typedef base::MessagePumpForIO::IOContext IOContext; |
+ void AddIOObserver(IOObserver* io_observer) { |
+ pump_io()->AddIOObserver(io_observer); |
+ } |
+ |
+ void RemoveIOObserver(IOObserver* io_observer) { |
+ pump_io()->RemoveIOObserver(io_observer); |
+ } |
+#if defined(OS_WIN) |
// Please see MessagePumpWin for definitions of these methods. |
void RegisterIOHandler(HANDLE file_handle, IOHandler* handler); |
bool WaitForIOCompletion(DWORD timeout, IOHandler* filter); |
@@ -516,22 +563,17 @@ class MessageLoopForIO : public MessageLoop { |
} |
#elif defined(OS_POSIX) |
- typedef base::MessagePumpLibevent::Watcher Watcher; |
- typedef base::MessagePumpLibevent::FileDescriptorWatcher |
- FileDescriptorWatcher; |
- |
- enum Mode { |
- WATCH_READ = base::MessagePumpLibevent::WATCH_READ, |
- WATCH_WRITE = base::MessagePumpLibevent::WATCH_WRITE, |
- WATCH_READ_WRITE = base::MessagePumpLibevent::WATCH_READ_WRITE |
- }; |
- |
// Please see MessagePumpLibevent for definition. |
bool WatchFileDescriptor(int fd, |
bool persistent, |
Mode mode, |
FileDescriptorWatcher *controller, |
Watcher *delegate); |
+ |
+ private: |
+ base::MessagePumpLibevent* pump_io() { |
+ return static_cast<base::MessagePumpLibevent*>(pump_.get()); |
+ } |
#endif // defined(OS_POSIX) |
}; |