// Copyright 2015 the V8 project 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 V8_CANCELABLE_TASK_H_ #define V8_CANCELABLE_TASK_H_ #include "include/v8-platform.h" #include "src/base/macros.h" namespace v8 { namespace internal { class Isolate; class Cancelable { public: explicit Cancelable(Isolate* isolate); virtual ~Cancelable(); virtual void Cancel() { is_cancelled_ = true; } protected: Isolate* isolate_; bool is_cancelled_; private: DISALLOW_COPY_AND_ASSIGN(Cancelable); }; // Multiple inheritance can be used because Task is a pure interface. class CancelableTask : public Cancelable, public Task { public: explicit CancelableTask(Isolate* isolate) : Cancelable(isolate) {} // Task overrides. void Run() final { if (!is_cancelled_) { RunInternal(); } } virtual void RunInternal() = 0; private: DISALLOW_COPY_AND_ASSIGN(CancelableTask); }; // Multiple inheritance can be used because IdleTask is a pure interface. class CancelableIdleTask : public Cancelable, public IdleTask { public: explicit CancelableIdleTask(Isolate* isolate) : Cancelable(isolate) {} // IdleTask overrides. void Run(double deadline_in_seconds) final { if (!is_cancelled_) { RunInternal(deadline_in_seconds); } } virtual void RunInternal(double deadline_in_seconds) = 0; private: DISALLOW_COPY_AND_ASSIGN(CancelableIdleTask); }; } // namespace internal } // namespace v8 #endif // V8_CANCELABLE_TASK_H_