From 23f5ee3f8b0c9f854c080db48b1f97603576d865 Mon Sep 17 00:00:00 2001 From: "stoyan@chromium.org" <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> Date: Tue, 5 Oct 2010 23:38:55 +0000 Subject: 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 --- chrome_frame/task_marshaller.h | 63 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 chrome_frame/task_marshaller.h (limited to 'chrome_frame/task_marshaller.h') 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_ -- cgit v1.1