162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file. 462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifndef V8_HEAP_EMBEDDER_TRACING_H_ 662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define V8_HEAP_EMBEDDER_TRACING_H_ 762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "include/v8.h" 962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/flags.h" 1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/globals.h" 1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace v8 { 1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace internal { 1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Heap; 1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass V8_EXPORT_PRIVATE LocalEmbedderHeapTracer final { 1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef std::pair<void*, void*> WrapperInfo; 2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch LocalEmbedderHeapTracer() 2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch : remote_tracer_(nullptr), num_v8_marking_deque_was_empty_(0) {} 2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetRemoteTracer(EmbedderHeapTracer* tracer) { remote_tracer_ = tracer; } 2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool InUse() { return remote_tracer_ != nullptr; } 2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void TracePrologue(); 2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void TraceEpilogue(); 2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void AbortTracing(); 3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void EnterFinalPause(); 3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool Trace(double deadline, 3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch EmbedderHeapTracer::AdvanceTracingActions actions); 3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t NumberOfWrappersToTrace(); 3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t NumberOfCachedWrappersToTrace() { 3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return cached_wrappers_to_trace_.size(); 3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void AddWrapperToTrace(WrapperInfo entry) { 3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch cached_wrappers_to_trace_.push_back(entry); 4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void ClearCachedWrappersToTrace() { cached_wrappers_to_trace_.clear(); } 4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void RegisterWrappersWithRemoteTracer(); 4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // In order to avoid running out of memory we force tracing wrappers if there 4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // are too many of them. 4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool RequiresImmediateWrapperProcessing(); 4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void NotifyV8MarkingDequeWasEmpty() { num_v8_marking_deque_was_empty_++; } 4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool ShouldFinalizeIncrementalMarking() { 5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const size_t kMaxIncrementalFixpointRounds = 3; 5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return !FLAG_incremental_marking_wrappers || !InUse() || 5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch NumberOfWrappersToTrace() == 0 || 5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch num_v8_marking_deque_was_empty_ > kMaxIncrementalFixpointRounds; 5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef std::vector<WrapperInfo> WrapperCache; 5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch EmbedderHeapTracer* remote_tracer_; 6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch WrapperCache cached_wrappers_to_trace_; 6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t num_v8_marking_deque_was_empty_; 6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} // namespace internal 6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} // namespace v8 6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif // V8_HEAP_EMBEDDER_TRACING_H_ 68