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

Side by Side Diff: base/message_pump_win.h

Issue 3094: As an intermediary step towards having a message pump handling IO through com... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 3 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/message_loop.cc ('k') | base/message_pump_win.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef BASE_MESSAGE_PUMP_WIN_H_ 5 #ifndef BASE_MESSAGE_PUMP_WIN_H_
6 #define BASE_MESSAGE_PUMP_WIN_H_ 6 #define BASE_MESSAGE_PUMP_WIN_H_
7 7
8 #include <vector> 8 #include <vector>
9 9
10 #include <windows.h> 10 #include <windows.h>
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 // is peeked, and before a replacement kMsgHaveWork is posted). 55 // is peeked, and before a replacement kMsgHaveWork is posted).
56 // 56 //
57 // NOTE: Although it may seem odd that messages are used to start and stop this 57 // NOTE: Although it may seem odd that messages are used to start and stop this
58 // flow (as opposed to signaling objects, etc.), it should be understood that 58 // flow (as opposed to signaling objects, etc.), it should be understood that
59 // the native message pump will *only* respond to messages. As a result, it is 59 // the native message pump will *only* respond to messages. As a result, it is
60 // an excellent choice. It is also helpful that the starter messages that are 60 // an excellent choice. It is also helpful that the starter messages that are
61 // placed in the queue when new task arrive also awakens DoRunLoop. 61 // placed in the queue when new task arrive also awakens DoRunLoop.
62 // 62 //
63 class MessagePumpWin : public MessagePump { 63 class MessagePumpWin : public MessagePump {
64 public: 64 public:
65 // Used with WatchObject to asynchronously monitor the signaled state of a
66 // HANDLE object.
67 class Watcher {
68 public:
69 virtual ~Watcher() {}
70 // Called from MessageLoop::Run when a signalled object is detected.
71 virtual void OnObjectSignaled(HANDLE object) = 0;
72 };
73
74 // An Observer is an object that receives global notifications from the 65 // An Observer is an object that receives global notifications from the
75 // MessageLoop. 66 // MessageLoop.
76 // 67 //
77 // NOTE: An Observer implementation should be extremely fast! 68 // NOTE: An Observer implementation should be extremely fast!
78 // 69 //
79 class Observer { 70 class Observer {
80 public: 71 public:
81 virtual ~Observer() {} 72 virtual ~Observer() {}
82 73
83 // This method is called before processing a message. 74 // This method is called before processing a message.
(...skipping 15 matching lines...) Expand all
99 // from Dispatch. 90 // from Dispatch.
100 class Dispatcher { 91 class Dispatcher {
101 public: 92 public:
102 virtual ~Dispatcher() {} 93 virtual ~Dispatcher() {}
103 // Dispatches the event. If true is returned processing continues as 94 // Dispatches the event. If true is returned processing continues as
104 // normal. If false is returned, the nested loop exits immediately. 95 // normal. If false is returned, the nested loop exits immediately.
105 virtual bool Dispatch(const MSG& msg) = 0; 96 virtual bool Dispatch(const MSG& msg) = 0;
106 }; 97 };
107 98
108 MessagePumpWin(); 99 MessagePumpWin();
109 ~MessagePumpWin(); 100 virtual ~MessagePumpWin();
110
111 // Have the current thread's message loop watch for a signaled object.
112 // Pass a null watcher to stop watching the object.
113 void WatchObject(HANDLE, Watcher*);
114 101
115 // Add an Observer, which will start receiving notifications immediately. 102 // Add an Observer, which will start receiving notifications immediately.
116 void AddObserver(Observer* observer); 103 void AddObserver(Observer* observer);
117 104
118 // Remove an Observer. It is safe to call this method while an Observer is 105 // Remove an Observer. It is safe to call this method while an Observer is
119 // receiving a notification callback. 106 // receiving a notification callback.
120 void RemoveObserver(Observer* observer); 107 void RemoveObserver(Observer* observer);
121 108
122 // Give a chance to code processing additional messages to notify the 109 // Give a chance to code processing additional messages to notify the
123 // message loop observers that another message has been processed. 110 // message loop observers that another message has been processed.
124 void WillProcessMessage(const MSG& msg); 111 void WillProcessMessage(const MSG& msg);
125 void DidProcessMessage(const MSG& msg); 112 void DidProcessMessage(const MSG& msg);
126 113
127 // Applications can call this to encourage us to process all pending WM_PAINT 114 // Applications can call this to encourage us to process all pending WM_PAINT
128 // messages. This method will process all paint messages the Windows Message 115 // messages. This method will process all paint messages the Windows Message
129 // queue can provide, up to some fixed number (to avoid any infinite loops). 116 // queue can provide, up to some fixed number (to avoid any infinite loops).
130 void PumpOutPendingPaintMessages(); 117 void PumpOutPendingPaintMessages();
131 118
132 // Like MessagePump::Run, but MSG objects are routed through dispatcher. 119 // Like MessagePump::Run, but MSG objects are routed through dispatcher.
133 void RunWithDispatcher(Delegate* delegate, Dispatcher* dispatcher); 120 void RunWithDispatcher(Delegate* delegate, Dispatcher* dispatcher);
134 121
135 // MessagePump methods: 122 // MessagePump methods:
136 virtual void Run(Delegate* delegate) { RunWithDispatcher(delegate, NULL); } 123 virtual void Run(Delegate* delegate) { RunWithDispatcher(delegate, NULL); }
137 virtual void Quit(); 124 virtual void Quit();
138 virtual void ScheduleWork(); 125 virtual void ScheduleWork();
139 virtual void ScheduleDelayedWork(const Time& delayed_work_time); 126 virtual void ScheduleDelayedWork(const Time& delayed_work_time);
140 127
141 private: 128 protected:
142 struct RunState { 129 struct RunState {
143 Delegate* delegate; 130 Delegate* delegate;
144 Dispatcher* dispatcher; 131 Dispatcher* dispatcher;
145 132
146 // Used to flag that the current Run() invocation should return ASAP. 133 // Used to flag that the current Run() invocation should return ASAP.
147 bool should_quit; 134 bool should_quit;
148 135
149 // Used to count how many Run() invocations are on the stack. 136 // Used to count how many Run() invocations are on the stack.
150 int run_depth; 137 int run_depth;
151 }; 138 };
152 139
153 static LRESULT CALLBACK WndProcThunk( 140 static LRESULT CALLBACK WndProcThunk(
154 HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); 141 HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
142 virtual void DoRunLoop() = 0;
155 void InitMessageWnd(); 143 void InitMessageWnd();
156 void HandleWorkMessage(); 144 void HandleWorkMessage();
157 void HandleTimerMessage(); 145 void HandleTimerMessage();
158 void DoRunLoop();
159 void WaitForWork();
160 bool ProcessNextWindowsMessage(); 146 bool ProcessNextWindowsMessage();
161 bool ProcessMessageHelper(const MSG& msg); 147 bool ProcessMessageHelper(const MSG& msg);
162 bool ProcessPumpReplacementMessage(); 148 bool ProcessPumpReplacementMessage();
163 bool ProcessNextObject();
164 bool SignalWatcher(size_t object_index);
165 int GetCurrentDelay() const; 149 int GetCurrentDelay() const;
166 150
167 // A hidden message-only window. 151 // A hidden message-only window.
168 HWND message_hwnd_; 152 HWND message_hwnd_;
169 153
170 // A vector of objects (and corresponding watchers) that are routinely
171 // serviced by this message pump.
172 std::vector<HANDLE> objects_;
173 std::vector<Watcher*> watchers_;
174
175 ObserverList<Observer> observers_; 154 ObserverList<Observer> observers_;
176 155
177 // The time at which delayed work should run. 156 // The time at which delayed work should run.
178 Time delayed_work_time_; 157 Time delayed_work_time_;
179 158
180 // A boolean value used to indicate if there is a kMsgDoWork message pending 159 // A boolean value used to indicate if there is a kMsgDoWork message pending
181 // in the Windows Message queue. There is at most one such message, and it 160 // in the Windows Message queue. There is at most one such message, and it
182 // can drive execution of tasks when a native message pump is running. 161 // can drive execution of tasks when a native message pump is running.
183 LONG have_work_; 162 LONG have_work_;
184 163
185 // State for the current invocation of Run. 164 // State for the current invocation of Run.
186 RunState* state_; 165 RunState* state_;
187 }; 166 };
188 167
168 //-----------------------------------------------------------------------------
169 // MessagePumpForUI extends MessagePumpWin with methods that are particular to a
170 // MessageLoop instantiated with TYPE_UI.
171 //
172 class MessagePumpForUI : public MessagePumpWin {
173 public:
174 MessagePumpForUI() {}
175 virtual ~MessagePumpForUI() {}
176 private:
177 virtual void DoRunLoop();
178 void WaitForWork();
179 };
180
181 //-----------------------------------------------------------------------------
182 // MessagePumpForIO extends MessagePumpWin with methods that are particular to a
183 // MessageLoop instantiated with TYPE_IO.
184 //
185 class MessagePumpForIO : public MessagePumpWin {
186 public:
187 // Used with WatchObject to asynchronously monitor the signaled state of a
188 // HANDLE object.
189 class Watcher {
190 public:
191 virtual ~Watcher() {}
192 // Called from MessageLoop::Run when a signalled object is detected.
193 virtual void OnObjectSignaled(HANDLE object) = 0;
194 };
195
196 MessagePumpForIO() {}
197 virtual ~MessagePumpForIO() {}
198
199 // Have the current thread's message loop watch for a signaled object.
200 // Pass a null watcher to stop watching the object.
201 void WatchObject(HANDLE, Watcher*);
202
203 private:
204 virtual void DoRunLoop();
205 void WaitForWork();
206 bool ProcessNextObject();
207 bool SignalWatcher(size_t object_index);
208
209 // A vector of objects (and corresponding watchers) that are routinely
210 // serviced by this message pump.
211 std::vector<HANDLE> objects_;
212 std::vector<Watcher*> watchers_;
213 };
214
189 } // namespace base 215 } // namespace base
190 216
191 #endif // BASE_MESSAGE_PUMP_WIN_H_ 217 #endif // BASE_MESSAGE_PUMP_WIN_H_
192 218
OLDNEW
« no previous file with comments | « base/message_loop.cc ('k') | base/message_pump_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698