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#include "src/heap/incremental-marking-job.h"
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/platform/time.h"
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/heap/heap-inl.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/heap/heap.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/heap/incremental-marking.h"
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/isolate.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/v8.h"
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid IncrementalMarkingJob::Start(Heap* heap) {
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!heap->incremental_marking()->IsStopped());
19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ScheduleTask(heap);
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid IncrementalMarkingJob::NotifyTask() { task_pending_ = false; }
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
24f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid IncrementalMarkingJob::ScheduleTask(Heap* heap) {
25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (!task_pending_) {
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(heap->isolate());
27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    task_pending_ = true;
28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    auto task = new Task(heap->isolate(), this);
29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    V8::GetCurrentPlatform()->CallOnForegroundThread(isolate, task);
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid IncrementalMarkingJob::Task::Step(Heap* heap) {
34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  const int kIncrementalMarkingDelayMs = 1;
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  double deadline =
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      heap->MonotonicallyIncreasingTimeInMs() + kIncrementalMarkingDelayMs;
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  heap->incremental_marking()->AdvanceIncrementalMarking(
38f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      deadline, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD,
39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      i::IncrementalMarking::FORCE_COMPLETION, i::StepOrigin::kTask);
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  heap->FinalizeIncrementalMarkingIfComplete(
41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      GarbageCollectionReason::kFinalizeMarkingViaTask);
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid IncrementalMarkingJob::Task::RunInternal() {
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Heap* heap = isolate()->heap();
46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  job_->NotifyTask();
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  IncrementalMarking* incremental_marking = heap->incremental_marking();
48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (incremental_marking->IsStopped()) {
49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (heap->IncrementalMarkingLimitReached() !=
50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        Heap::IncrementalMarkingLimit::kNoLimit) {
51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      heap->StartIncrementalMarking(Heap::kNoGCFlags,
52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                    GarbageCollectionReason::kIdleTask,
53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                    kNoGCCallbackFlags);
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
55f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
56f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (!incremental_marking->IsStopped()) {
57f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Step(heap);
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!incremental_marking->IsStopped()) {
59f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      job_->ScheduleTask(heap);
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
66