incremental-marking-job.cc 2.26 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
// 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.

#include "src/heap/incremental-marking-job.h"

#include "src/base/platform/time.h"
#include "src/heap/heap-inl.h"
#include "src/heap/heap.h"
#include "src/heap/incremental-marking.h"
#include "src/isolate.h"
#include "src/v8.h"
13
#include "src/vm-state-inl.h"
14 15 16 17 18 19

namespace v8 {
namespace internal {

void IncrementalMarkingJob::Start(Heap* heap) {
  DCHECK(!heap->incremental_marking()->IsStopped());
20
  ScheduleTask(heap);
21 22
}

23
void IncrementalMarkingJob::NotifyTask() { task_pending_ = false; }
24

25
void IncrementalMarkingJob::ScheduleTask(Heap* heap) {
26
  if (!task_pending_) {
27
    v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(heap->isolate());
28
    task_pending_ = true;
29 30
    auto task = new Task(heap->isolate(), this);
    V8::GetCurrentPlatform()->CallOnForegroundThread(isolate, task);
31 32 33
  }
}

34 35
void IncrementalMarkingJob::Task::Step(Heap* heap) {
  const int kIncrementalMarkingDelayMs = 1;
36 37
  double deadline =
      heap->MonotonicallyIncreasingTimeInMs() + kIncrementalMarkingDelayMs;
38
  heap->incremental_marking()->AdvanceIncrementalMarking(
39 40
      deadline, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD,
      i::IncrementalMarking::FORCE_COMPLETION, i::StepOrigin::kTask);
41
  heap->FinalizeIncrementalMarkingIfComplete(
42
      GarbageCollectionReason::kFinalizeMarkingViaTask);
43 44
}

45
void IncrementalMarkingJob::Task::RunInternal() {
46
  VMState<GC> state(isolate());
47 48
  RuntimeCallTimerScope runtime_timer(
      isolate(), &RuntimeCallStats::GC_IncrementalMarkingJob);
49

50
  Heap* heap = isolate()->heap();
51
  job_->NotifyTask();
52
  IncrementalMarking* incremental_marking = heap->incremental_marking();
53 54 55 56 57
  if (incremental_marking->IsStopped()) {
    if (heap->IncrementalMarkingLimitReached() !=
        Heap::IncrementalMarkingLimit::kNoLimit) {
      heap->StartIncrementalMarking(Heap::kNoGCFlags,
                                    GarbageCollectionReason::kIdleTask,
58
                                    kGCCallbackScheduleIdleGarbageCollection);
59 60
    }
  }
61
  if (!incremental_marking->IsStopped()) {
62
    Step(heap);
63
    if (!incremental_marking->IsStopped()) {
64
      job_->ScheduleTask(heap);
65 66 67 68 69 70
    }
  }
}

}  // namespace internal
}  // namespace v8