[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 1 | // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. | ||||
4 | |||||
5 | #ifndef CHROME_FRAME_TASK_MARSHALLER_H_ | ||||
6 | #define CHROME_FRAME_TASK_MARSHALLER_H_ | ||||
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 7 | |
8 | #include <windows.h> | ||||
9 | #include <deque> | ||||
10 | #include <queue> | ||||
[email protected] | 20305ec | 2011-01-21 04:55:52 | [diff] [blame] | 11 | |
[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 12 | #include "base/callback.h" |
13 | #include "base/pending_task.h" | ||||
[email protected] | 20305ec | 2011-01-21 04:55:52 | [diff] [blame] | 14 | #include "base/synchronization/lock.h" |
[email protected] | c917750 | 2011-01-01 04:48:49 | [diff] [blame] | 15 | #include "base/threading/non_thread_safe.h" |
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 16 | #include "base/time.h" |
[email protected] | c917750 | 2011-01-01 04:48:49 | [diff] [blame] | 17 | |
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 18 | class Task; |
[email protected] | bb04c4e | 2011-11-18 20:44:22 | [diff] [blame] | 19 | |
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 20 | namespace tracked_objects { |
[email protected] | bb04c4e | 2011-11-18 20:44:22 | [diff] [blame] | 21 | class Location; |
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 22 | } |
23 | |||||
24 | // TaskMarshallerThroughMessageQueue is similar to base::MessageLoopForUI | ||||
25 | // in cases where we do not control the thread lifetime and message retrieval | ||||
26 | // and dispatching. It uses a HWND to ::PostMessage to it as a signal that | ||||
27 | // the task queue is not empty. | ||||
[email protected] | c917750 | 2011-01-01 04:48:49 | [diff] [blame] | 28 | class TaskMarshallerThroughMessageQueue : public base::NonThreadSafe { |
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 29 | public: |
30 | TaskMarshallerThroughMessageQueue(); | ||||
[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 31 | virtual ~TaskMarshallerThroughMessageQueue(); |
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 32 | |
33 | void SetWindow(HWND wnd, UINT msg) { | ||||
34 | wnd_ = wnd; | ||||
35 | msg_ = msg; | ||||
36 | } | ||||
37 | |||||
38 | virtual void PostTask(const tracked_objects::Location& from_here, | ||||
[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 39 | const base::Closure& task); |
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 40 | virtual void PostDelayedTask(const tracked_objects::Location& source, |
[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 41 | const base::Closure& task, |
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 42 | base::TimeDelta& delay); |
[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 43 | |
[email protected] | 11b6e60 | 2010-10-13 16:02:26 | [diff] [blame] | 44 | // Called by the owner of the HWND. |
45 | BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, | ||||
46 | LRESULT& lResult, DWORD dwMsgMapID = 0); | ||||
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 47 | private: |
[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 48 | void ClearTasks(); |
49 | inline base::Closure PopTask(); | ||||
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 50 | inline void ExecuteQueuedTasks(); |
51 | void ExecuteDelayedTasks(); | ||||
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 52 | |
[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 53 | // Shortest delays ordered at the top of the queue. |
54 | base::DelayedTaskQueue delayed_tasks_; | ||||
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 55 | |
[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 56 | // A list of tasks that need to be processed by this instance. |
57 | std::queue<base::Closure> pending_tasks_; | ||||
58 | |||||
59 | // Lock accesses to |pending_tasks_|. | ||||
[email protected] | 20305ec | 2011-01-21 04:55:52 | [diff] [blame] | 60 | base::Lock lock_; |
[email protected] | 262060ff | 2011-11-17 23:26:53 | [diff] [blame] | 61 | |
62 | // ::PostMessage parameters. | ||||
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 63 | HWND wnd_; |
64 | UINT msg_; | ||||
[email protected] | 5a8db80 | 2010-10-06 17:34:43 | [diff] [blame] | 65 | }; |
66 | |||||
67 | #endif // CHROME_FRAME_TASK_MARSHALLER_H_ |