1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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_ 7 8 #include <windows.h> 9 #include <deque> 10 #include <queue> 11 12 #include "base/callback.h" 13 #include "base/pending_task.h" 14 #include "base/synchronization/lock.h" 15 #include "base/threading/non_thread_safe.h" 16 #include "base/time/time.h" 17 18 class Task; 19 20 namespace tracked_objects { 21 class Location; 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. 28 class TaskMarshallerThroughMessageQueue : public base::NonThreadSafe { 29 public: 30 TaskMarshallerThroughMessageQueue(); 31 virtual ~TaskMarshallerThroughMessageQueue(); 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, 39 const base::Closure& task); 40 virtual void PostDelayedTask(const tracked_objects::Location& source, 41 const base::Closure& task, 42 base::TimeDelta& delay); 43 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); 47 private: 48 void ClearTasks(); 49 inline base::Closure PopTask(); 50 inline void ExecuteQueuedTasks(); 51 void ExecuteDelayedTasks(); 52 53 // Shortest delays ordered at the top of the queue. 54 base::DelayedTaskQueue delayed_tasks_; 55 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_|. 60 base::Lock lock_; 61 62 // ::PostMessage parameters. 63 HWND wnd_; 64 UINT msg_; 65 }; 66 67 #endif // CHROME_FRAME_TASK_MARSHALLER_H_ 68