1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_HEAP_INCREMENTAL_MARKING_JOB_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_HEAP_INCREMENTAL_MARKING_JOB_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/cancelable-task.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Heap;
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Isolate;
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The incremental marking job uses platform tasks to perform incremental
17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// marking steps. The job posts a foreground task that makes a small (~1ms)
18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// step and posts another task until the marking is completed.
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass IncrementalMarkingJob {
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  class Task : public CancelableTask {
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   public:
23f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    explicit Task(Isolate* isolate, IncrementalMarkingJob* job)
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        : CancelableTask(isolate), job_(job) {}
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    static void Step(Heap* heap);
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // CancelableTask overrides.
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    void RunInternal() override;
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch   private:
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    IncrementalMarkingJob* job_;
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  };
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  IncrementalMarkingJob() : task_pending_(false) {}
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool TaskPending() { return task_pending_; }
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void Start(Heap* heap);
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void NotifyTask();
40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void ScheduleTask(Heap* heap);
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool task_pending_;
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_HEAP_INCREMENTAL_MARKING_JOB_H_
50