// Copyright 2012 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_HEAP_INCREMENTAL_MARKING_JOB_H_
#define V8_HEAP_INCREMENTAL_MARKING_JOB_H_

#include "src/cancelable-task.h"

namespace v8 {
namespace internal {

class Heap;
class Isolate;

// The incremental marking job uses platform tasks to perform incremental
// marking steps. The job posts an idle and a delayed task with a large delay.
// The delayed task performs steps only if the idle task is not making progress.
// We expect this to be a rare event since incremental marking should finish
// quickly with the help of the mutator and the idle task.
// The delayed task guarantees that we eventually finish incremental marking
// even if the mutator becomes idle and the platform stops running idle tasks,
// which can happen for background tabs in Chrome.
class IncrementalMarkingJob {
 public:
  class IdleTask : public CancelableIdleTask {
   public:
    explicit IdleTask(Isolate* isolate, IncrementalMarkingJob* job)
        : CancelableIdleTask(isolate), job_(job) {}
    enum Progress { kDone, kMoreWork };
    static Progress Step(Heap* heap, double deadline_in_ms);
    // CancelableIdleTask overrides.
    void RunInternal(double deadline_in_seconds) override;

   private:
    IncrementalMarkingJob* job_;
  };

  class DelayedTask : public CancelableTask {
   public:
    explicit DelayedTask(Isolate* isolate, IncrementalMarkingJob* job)
        : CancelableTask(isolate), job_(job) {}
    static void Step(Heap* heap);
    // CancelableTask overrides.
    void RunInternal() override;

   private:
    IncrementalMarkingJob* job_;
  };

  // Delay of the delayed task.
  static const double kLongDelayInSeconds;
  static const double kShortDelayInSeconds;

  IncrementalMarkingJob()
      : idle_task_pending_(false),
        delayed_task_pending_(false),
        made_progress_since_last_delayed_task_(false) {}

  bool ShouldForceMarkingStep() {
    return !made_progress_since_last_delayed_task_;
  }

  bool IdleTaskPending() { return idle_task_pending_; }

  void Start(Heap* heap);

  void NotifyIdleTask();
  void NotifyDelayedTask();
  void NotifyIdleTaskProgress();
  void ScheduleIdleTask(Heap* heap);
  void ScheduleDelayedTask(Heap* heap);

 private:
  bool idle_task_pending_;
  bool delayed_task_pending_;
  bool made_progress_since_last_delayed_task_;
};
}  // namespace internal
}  // namespace v8

#endif  // V8_HEAP_INCREMENTAL_MARKING_JOB_H_
