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

Unified Diff: base/message_loop/message_pump_win.h

Issue 1714263002: Version of MessagePumpForUI optimized for GPU process (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 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/message_pump_win.h
diff --git a/base/message_loop/message_pump_win.h b/base/message_loop/message_pump_win.h
index 6f4b699cefdfce5a3fac2249d6ebbcc2bf4c5bed..69291dc78a83370634370e78612318d70fda47ce 100644
--- a/base/message_loop/message_pump_win.h
+++ b/base/message_loop/message_pump_win.h
@@ -22,7 +22,7 @@ namespace base {
// controlling the lifetime of the message pump.
class BASE_EXPORT MessagePumpWin : public MessagePump {
public:
- MessagePumpWin() : have_work_(0), state_(NULL) {}
+ MessagePumpWin() : work_state_(READY), state_(NULL) {}
// MessagePump methods:
void Run(Delegate* delegate) override;
@@ -39,22 +39,69 @@ class BASE_EXPORT MessagePumpWin : public MessagePump {
int run_depth;
};
+ // State used with work_state_ variable.
+ enum WorkState {
+ READY = 0, // Ready to accept new work.
+ HAVE_WORK = 1, // New work has been signalled.
+ WORKING = 2 // Handling the work.
+ };
+
virtual void DoRunLoop() = 0;
int GetCurrentDelay() const;
// The time at which delayed work should run.
TimeTicks delayed_work_time_;
- // A boolean value used to indicate if there is a kMsgDoWork message pending
+ // A value used to indicate if there is a kMsgDoWork message pending
// in the Windows Message queue. There is at most one such message, and it
// can drive execution of tasks when a native message pump is running.
- LONG have_work_;
+ LONG work_state_;
// State for the current invocation of Run.
RunState* state_;
};
//-----------------------------------------------------------------------------
+// MessagePumpForUIBase serves as a base class for for specialized versions of
+// MessagePump instantiated with TYPE_UI. It provides basic functionality for
+// creating a hidden window with a message queue and handling window messages,
+// including the special kMsgHaveWork message that indicates the scheduled work,
+// handling timers, etc.
+//
+class BASE_EXPORT MessagePumpForUIBase : public MessagePumpWin {
+ public:
+ // The application-defined code passed to the hook procedure.
+ static const int kMessageFilterCode = 0x5001;
+
+ MessagePumpForUIBase();
+ ~MessagePumpForUIBase() override;
+
+ // MessagePump methods:
+ void ScheduleWork() override;
+
+ protected:
+ virtual void HandleWorkMessage() = 0;
+ virtual void HandleTimerMessage() = 0;
+
+ bool IsWorkMessage(const MSG& msg) const;
+ void SetTimer(int delay_msec);
+ void KillTimer();
+
+ private:
+ static LRESULT CALLBACK WndProcThunk(HWND window_handle,
+ UINT message,
+ WPARAM wparam,
+ LPARAM lparam);
+ void InitMessageWnd();
+
+ // Atom representing the registered window class.
+ ATOM atom_;
+
+ // A hidden message-only window.
+ HWND message_hwnd_;
+};
+
+//-----------------------------------------------------------------------------
// MessagePumpForUI extends MessagePumpWin with methods that are particular to a
// MessageLoop instantiated with TYPE_UI.
//
@@ -102,38 +149,53 @@ class BASE_EXPORT MessagePumpWin : public MessagePump {
// an excellent choice. It is also helpful that the starter messages that are
// placed in the queue when new task arrive also awakens DoRunLoop.
//
-class BASE_EXPORT MessagePumpForUI : public MessagePumpWin {
+class BASE_EXPORT MessagePumpForUI : public MessagePumpForUIBase {
public:
- // The application-defined code passed to the hook procedure.
- static const int kMessageFilterCode = 0x5001;
-
MessagePumpForUI();
~MessagePumpForUI() override;
+ private:
// MessagePump methods:
- void ScheduleWork() override;
+ void DoRunLoop() override;
void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override;
- private:
- static LRESULT CALLBACK WndProcThunk(HWND window_handle,
- UINT message,
- WPARAM wparam,
- LPARAM lparam);
- void DoRunLoop() override;
- void InitMessageWnd();
- void WaitForWork();
- void HandleWorkMessage();
- void HandleTimerMessage();
- void RescheduleTimer();
+ void HandleWorkMessage() override;
+ void HandleTimerMessage() override;
+
bool ProcessNextWindowsMessage();
+ void WaitForWork();
+
bool ProcessMessageHelper(const MSG& msg);
bool ProcessPumpReplacementMessage();
+ void RescheduleTimer();
+};
- // Atom representing the registered window class.
- ATOM atom_;
+//-----------------------------------------------------------------------------
+// MessagePumpForGpu is a simplified version of MessagePumpForUI that is
+// optimized for the GPU process. Unlike MessagePumpForUI it doesn't handle a
+// situation where a native message pump might be used by modal dialogs and
+// message boxes. That allows to skip some system calls like setting and killing
+// timers, getting status of the message queue, etc.
- // A hidden message-only window.
- HWND message_hwnd_;
+class BASE_EXPORT MessagePumpForGpu : public MessagePumpForUIBase {
+ public:
+ MessagePumpForGpu();
+ ~MessagePumpForGpu() override;
+
+ // Factory methods.
+ static void InitFactory();
+ static scoped_ptr<MessagePump> CreateMessagePumpForGpu();
+
+ private:
+ // MessagePump methods:
+ void DoRunLoop() override;
+ void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override;
+
+ void HandleWorkMessage() override;
+ void HandleTimerMessage() override;
+
+ void ProcessWindowsMessages();
+ void WaitForWork();
};
//-----------------------------------------------------------------------------

Powered by Google App Engine
This is Rietveld 408576698