blob: 073e1ee9573459779b046c14256f5282de662a6c [file] [log] [blame]
// Copyright 2015 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 WebTaskRunner_h
#define WebTaskRunner_h
#include "base/callback_forward.h"
#include "public/platform/WebCommon.h"
#include "public/platform/WebTraceLocation.h"
#include "wtf/Compiler.h"
#include "wtf/Functional.h"
#include "wtf/RefCounted.h"
#include "wtf/WeakPtr.h"
#include <memory>
namespace base {
class SingleThreadTaskRunner;
}
namespace blink {
using SingleThreadTaskRunner = base::SingleThreadTaskRunner;
// TaskHandle is associated to a task posted by
// WebTaskRunner::postCancellableTask or
// WebTaskRunner::postCancellableDelayedTask and cancels the associated task on
// TaskHandle::cancel() call or on TaskHandle destruction.
class BLINK_PLATFORM_EXPORT TaskHandle {
public:
// Returns true if the task will run later. Returns false if the task is
// cancelled or the task is run already.
// This function is not thread safe. Call this on the thread that has posted
// the task.
bool isActive() const;
// Cancels the task invocation. Do nothing if the task is cancelled or run
// already.
// This function is not thread safe. Call this on the thread that has posted
// the task.
void cancel();
TaskHandle();
~TaskHandle();
TaskHandle(TaskHandle&&);
TaskHandle& operator=(TaskHandle&&);
class Runner;
private:
friend class WebTaskRunner;
explicit TaskHandle(RefPtr<Runner>);
RefPtr<Runner> m_runner;
};
// The blink representation of a chromium SingleThreadTaskRunner.
class BLINK_PLATFORM_EXPORT WebTaskRunner {
public:
virtual ~WebTaskRunner() {}
// Schedule a task to be run after |delayMs| on the the associated WebThread.
// Can be called from any thread.
virtual void postDelayedTask(const WebTraceLocation&,
const base::Closure&,
double delayMs) = 0;
// Returns a clone of the WebTaskRunner.
virtual std::unique_ptr<WebTaskRunner> clone() = 0;
// Returns true if the current thread is a thread on which a task may be run.
// Can be called from any thread.
virtual bool runsTasksOnCurrentThread() = 0;
// ---
// Headless Chrome virtualises time for determinism and performance (fast
// forwarding of timers). To make this work some parts of blink (e.g. Timers)
// need to use virtual time, however by default new code should use the normal
// non-virtual time APIs.
// Returns a double which is the number of seconds since epoch (Jan 1, 1970).
// This may represent either the real time, or a virtual time depending on
// whether or not the WebTaskRunner is associated with a virtual time domain
// or a real time domain.
virtual double virtualTimeSeconds() const = 0;
// Returns a microsecond resolution platform dependant time source.
// This may represent either the real time, or a virtual time depending on
// whether or not the WebTaskRunner is associated with a virtual time domain
// or a real time domain.
virtual double monotonicallyIncreasingVirtualTimeSeconds() const = 0;
// Returns the underlying task runner object.
virtual SingleThreadTaskRunner* toSingleThreadTaskRunner() = 0;
// Helpers for posting bound functions as tasks.
// For cross-thread posting. Can be called from any thread.
void postTask(const WebTraceLocation&, std::unique_ptr<CrossThreadClosure>);
void postDelayedTask(const WebTraceLocation&,
std::unique_ptr<CrossThreadClosure>,
long long delayMs);
// For same-thread posting. Must be called from the associated WebThread.
void postTask(const WebTraceLocation&, std::unique_ptr<WTF::Closure>);
void postDelayedTask(const WebTraceLocation&,
std::unique_ptr<WTF::Closure>,
long long delayMs);
// For same-thread cancellable task posting. Returns a TaskHandle object for
// cancellation.
WARN_UNUSED_RESULT TaskHandle
postCancellableTask(const WebTraceLocation&, std::unique_ptr<WTF::Closure>);
WARN_UNUSED_RESULT TaskHandle
postDelayedCancellableTask(const WebTraceLocation&,
std::unique_ptr<WTF::Closure>,
long long delayMs);
};
} // namespace blink
#endif // WebTaskRunner_h