// Copyright 2016 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/embedder-tracing.h" #include "src/base/logging.h" namespace v8 { namespace internal { void LocalEmbedderHeapTracer::TracePrologue() { if (!InUse()) return; CHECK(cached_wrappers_to_trace_.empty()); num_v8_marking_worklist_was_empty_ = 0; remote_tracer_->TracePrologue(); } void LocalEmbedderHeapTracer::TraceEpilogue() { if (!InUse()) return; CHECK(cached_wrappers_to_trace_.empty()); remote_tracer_->TraceEpilogue(); } void LocalEmbedderHeapTracer::EnterFinalPause() { if (!InUse()) return; remote_tracer_->EnterFinalPause(embedder_stack_state_); // Resetting to state unknown as there may be follow up garbage collections // triggered from callbacks that have a different stack state. embedder_stack_state_ = EmbedderHeapTracer::kUnknown; } bool LocalEmbedderHeapTracer::Trace(double deadline) { if (!InUse()) return true; DCHECK_EQ(0, NumberOfCachedWrappersToTrace()); return remote_tracer_->AdvanceTracing(deadline); } bool LocalEmbedderHeapTracer::IsRemoteTracingDone() { return (InUse()) ? cached_wrappers_to_trace_.empty() && remote_tracer_->IsTracingDone() : true; } void LocalEmbedderHeapTracer::RegisterWrappersWithRemoteTracer() { if (!InUse()) return; if (cached_wrappers_to_trace_.empty()) { return; } remote_tracer_->RegisterV8References(cached_wrappers_to_trace_); cached_wrappers_to_trace_.clear(); } bool LocalEmbedderHeapTracer::RequiresImmediateWrapperProcessing() { const size_t kTooManyWrappers = 16000; return cached_wrappers_to_trace_.size() > kTooManyWrappers; } void LocalEmbedderHeapTracer::SetEmbedderStackStateForNextFinalization( EmbedderHeapTracer::EmbedderStackState stack_state) { if (!InUse()) return; embedder_stack_state_ = stack_state; } } // namespace internal } // namespace v8