diff options
Diffstat (limited to 'deps/v8/src/heap/embedder-tracing.h')
-rw-r--r-- | deps/v8/src/heap/embedder-tracing.h | 78 |
1 files changed, 51 insertions, 27 deletions
diff --git a/deps/v8/src/heap/embedder-tracing.h b/deps/v8/src/heap/embedder-tracing.h index 2588200db9..09242042dd 100644 --- a/deps/v8/src/heap/embedder-tracing.h +++ b/deps/v8/src/heap/embedder-tracing.h @@ -13,74 +13,98 @@ namespace v8 { namespace internal { class Heap; +class JSObject; class V8_EXPORT_PRIVATE LocalEmbedderHeapTracer final { public: typedef std::pair<void*, void*> WrapperInfo; + typedef std::vector<WrapperInfo> WrapperCache; - explicit LocalEmbedderHeapTracer(Isolate* isolate) : isolate_(isolate) {} + class V8_EXPORT_PRIVATE ProcessingScope { + public: + explicit ProcessingScope(LocalEmbedderHeapTracer* tracer); + ~ProcessingScope(); - ~LocalEmbedderHeapTracer() { - if (remote_tracer_) remote_tracer_->isolate_ = nullptr; - } + void TracePossibleWrapper(JSObject js_object); - EmbedderHeapTracer* remote_tracer() const { return remote_tracer_; } + void AddWrapperInfoForTesting(WrapperInfo info); - void SetRemoteTracer(EmbedderHeapTracer* tracer) { - if (remote_tracer_) remote_tracer_->isolate_ = nullptr; + private: + static constexpr size_t kWrapperCacheSize = 1000; + + void FlushWrapperCacheIfFull(); - remote_tracer_ = tracer; - if (remote_tracer_) - remote_tracer_->isolate_ = reinterpret_cast<v8::Isolate*>(isolate_); + LocalEmbedderHeapTracer* const tracer_; + WrapperCache wrapper_cache_; + }; + + explicit LocalEmbedderHeapTracer(Isolate* isolate) : isolate_(isolate) {} + + ~LocalEmbedderHeapTracer() { + if (remote_tracer_) remote_tracer_->isolate_ = nullptr; } bool InUse() const { return remote_tracer_ != nullptr; } + EmbedderHeapTracer* remote_tracer() const { return remote_tracer_; } + void SetRemoteTracer(EmbedderHeapTracer* tracer); void TracePrologue(); void TraceEpilogue(); void EnterFinalPause(); bool Trace(double deadline); bool IsRemoteTracingDone(); - size_t NumberOfCachedWrappersToTrace() { - return cached_wrappers_to_trace_.size(); - } - void AddWrapperToTrace(WrapperInfo entry) { - cached_wrappers_to_trace_.push_back(entry); - } - void ClearCachedWrappersToTrace() { cached_wrappers_to_trace_.clear(); } - void RegisterWrappersWithRemoteTracer(); - - // In order to avoid running out of memory we force tracing wrappers if there - // are too many of them. - bool RequiresImmediateWrapperProcessing(); - void NotifyV8MarkingWorklistWasEmpty() { num_v8_marking_worklist_was_empty_++; } + bool ShouldFinalizeIncrementalMarking() { static const size_t kMaxIncrementalFixpointRounds = 3; return !FLAG_incremental_marking_wrappers || !InUse() || - IsRemoteTracingDone() || + (IsRemoteTracingDone() && embedder_worklist_empty_) || num_v8_marking_worklist_was_empty_ > kMaxIncrementalFixpointRounds; } void SetEmbedderStackStateForNextFinalization( EmbedderHeapTracer::EmbedderStackState stack_state); - private: - typedef std::vector<WrapperInfo> WrapperCache; + void SetEmbedderWorklistEmpty(bool is_empty) { + embedder_worklist_empty_ = is_empty; + } + private: Isolate* const isolate_; - WrapperCache cached_wrappers_to_trace_; EmbedderHeapTracer* remote_tracer_ = nullptr; + size_t num_v8_marking_worklist_was_empty_ = 0; EmbedderHeapTracer::EmbedderStackState embedder_stack_state_ = EmbedderHeapTracer::kUnknown; + // Indicates whether the embedder worklist was observed empty on the main + // thread. This is opportunistic as concurrent marking tasks may hold local + // segments of potential embedder fields to move to the main thread. + bool embedder_worklist_empty_ = false; friend class EmbedderStackStateScope; }; +class V8_EXPORT_PRIVATE EmbedderStackStateScope final { + public: + EmbedderStackStateScope(LocalEmbedderHeapTracer* local_tracer, + EmbedderHeapTracer::EmbedderStackState stack_state) + : local_tracer_(local_tracer), + old_stack_state_(local_tracer_->embedder_stack_state_) { + local_tracer_->embedder_stack_state_ = stack_state; + } + + ~EmbedderStackStateScope() { + local_tracer_->embedder_stack_state_ = old_stack_state_; + } + + private: + LocalEmbedderHeapTracer* const local_tracer_; + const EmbedderHeapTracer::EmbedderStackState old_stack_state_; +}; + } // namespace internal } // namespace v8 |