Home | History | Annotate | Download | only in chrome_frame
      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