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