diff options
author | stoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-05 23:38:55 +0000 |
---|---|---|
committer | stoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-05 23:38:55 +0000 |
commit | 23f5ee3f8b0c9f854c080db48b1f97603576d865 (patch) | |
tree | 0b244a27b3a84e61fcea00316b5ff578b38d4ed4 /chrome_frame/task_marshaller.h | |
parent | 06552c1abc14f20e5dcc374a44c17e2cd29d9746 (diff) | |
download | chromium_src-23f5ee3f8b0c9f854c080db48b1f97603576d865.zip chromium_src-23f5ee3f8b0c9f854c080db48b1f97603576d865.tar.gz chromium_src-23f5ee3f8b0c9f854c080db48b1f97603576d865.tar.bz2 |
Initial skeleton for refactored ChromeFrameAutomationClient and AutomationProxy for the needs of ChromeFrame.
CFProxy is ready to some extent, while CFAC is mostly structure-only.
Review URL: http://codereview.chromium.org/3528004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61583 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/task_marshaller.h')
-rw-r--r-- | chrome_frame/task_marshaller.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/chrome_frame/task_marshaller.h b/chrome_frame/task_marshaller.h new file mode 100644 index 0000000..b3f87b8 --- /dev/null +++ b/chrome_frame/task_marshaller.h @@ -0,0 +1,63 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_FRAME_TASK_MARSHALLER_H_ +#define CHROME_FRAME_TASK_MARSHALLER_H_ +#pragma once + +#include <windows.h> +#include <deque> +#include <queue> +#include "base/lock.h" +#include "base/non_thread_safe.h" +#include "base/time.h" +class Task; +namespace tracked_objects { + class Location; +} + +// TaskMarshallerThroughMessageQueue is similar to base::MessageLoopForUI +// in cases where we do not control the thread lifetime and message retrieval +// and dispatching. It uses a HWND to ::PostMessage to it as a signal that +// the task queue is not empty. +class TaskMarshallerThroughMessageQueue : public NonThreadSafe { + public: + TaskMarshallerThroughMessageQueue(); + ~TaskMarshallerThroughMessageQueue(); + + void SetWindow(HWND wnd, UINT msg) { + wnd_ = wnd; + msg_ = msg; + } + + virtual void PostTask(const tracked_objects::Location& from_here, + Task* task); + virtual void PostDelayedTask(const tracked_objects::Location& source, + Task* task, + base::TimeDelta& delay); + private: + void DeleteAll(); + inline Task* PopTask(); + inline void ExecuteQueuedTasks(); + void ExecuteDelayedTasks(); + void RunTask(Task* task); + + struct DelayedTask { + DelayedTask(Task* task, base::Time at) : run_at(at), task(task), seq(0) {} + base::Time run_at; + Task* task; + int seq; + // To support sorting based on time in priority_queue. + bool operator<(const DelayedTask& other) const; + }; + + std::priority_queue<DelayedTask> delayed_tasks_; + std::queue<Task*> pending_tasks_; + Lock lock_; + HWND wnd_; + UINT msg_; + int invoke_task_; +}; + +#endif // CHROME_FRAME_TASK_MARSHALLER_H_ |