Index: src/heap/embedder-tracing.h |
diff --git a/src/heap/embedder-tracing.h b/src/heap/embedder-tracing.h |
index 60c85cd52f285a5d6c85794216a7da22a39fb00b..5e10d6e2e87f2acfe3948a6dc10994a52b5b7243 100644 |
--- a/src/heap/embedder-tracing.h |
+++ b/src/heap/embedder-tracing.h |
@@ -6,6 +6,7 @@ |
#define V8_HEAP_EMBEDDER_TRACING_H_ |
#include "include/v8.h" |
+#include "src/flags.h" |
#include "src/globals.h" |
namespace v8 { |
@@ -17,7 +18,8 @@ class V8_EXPORT_PRIVATE LocalEmbedderHeapTracer final { |
public: |
typedef std::pair<void*, void*> WrapperInfo; |
- LocalEmbedderHeapTracer() : remote_tracer_(nullptr) {} |
+ LocalEmbedderHeapTracer() |
+ : remote_tracer_(nullptr), num_v8_marking_deque_was_empty_(0) {} |
void SetRemoteTracer(EmbedderHeapTracer* tracer) { remote_tracer_ = tracer; } |
bool InUse() { return remote_tracer_ != nullptr; } |
@@ -43,11 +45,20 @@ class V8_EXPORT_PRIVATE LocalEmbedderHeapTracer final { |
// are too many of them. |
bool RequiresImmediateWrapperProcessing(); |
+ void NotifyV8MarkingDequeWasEmpty() { num_v8_marking_deque_was_empty_++; } |
+ bool ShouldFinalizeIncrementalMarking() { |
+ static const size_t kMaxIncrementalFixpointRounds = 3; |
+ return !FLAG_incremental_marking_wrappers || !InUse() || |
+ NumberOfWrappersToTrace() == 0 || |
+ num_v8_marking_deque_was_empty_ > kMaxIncrementalFixpointRounds; |
+ } |
+ |
private: |
typedef std::vector<WrapperInfo> WrapperCache; |
EmbedderHeapTracer* remote_tracer_; |
WrapperCache cached_wrappers_to_trace_; |
+ size_t num_v8_marking_deque_was_empty_; |
}; |
} // namespace internal |