Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Unified Diff: src/heap/heap.cc

Issue 2371733002: Introduce EmbedderReachableReferenceReporter (Closed)
Patch Set: Fix UsingEmbedderHeapTracer Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/incremental-marking.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/heap.cc
diff --git a/src/heap/heap.cc b/src/heap/heap.cc
index 2472d45b7faf8eced8091f8205348530c80902b7..ce1c06b61eedcc3f022ca9dffaa11afff4b90e19 100644
--- a/src/heap/heap.cc
+++ b/src/heap/heap.cc
@@ -162,6 +162,8 @@ Heap::Heap()
deserialization_complete_(false),
strong_roots_list_(NULL),
heap_iterator_depth_(0),
+ embedder_heap_tracer_(nullptr),
+ embedder_reference_reporter_(new TracePossibleWrapperReporter(this)),
force_oom_(false) {
// Allow build-time customization of the max semispace size. Building
// V8 with snapshots and a non-default max semispace size is much
@@ -1615,7 +1617,7 @@ void Heap::Scavenge() {
// Register found wrappers with embedder so it can add them to its marking
// deque and correctly manage the case when v8 scavenger collects the
// wrappers by either keeping wrappables alive, or cleaning marking deque.
- mark_compact_collector()->RegisterWrappersWithEmbedderHeapTracer();
+ RegisterWrappersWithEmbedderHeapTracer();
}
// Flip the semispaces. After flipping, to space is empty, from space has
@@ -4214,10 +4216,8 @@ void Heap::ReduceNewSpaceSize() {
bool Heap::MarkingDequesAreEmpty() {
return mark_compact_collector()->marking_deque()->IsEmpty() &&
(!UsingEmbedderHeapTracer() ||
- (mark_compact_collector()->wrappers_to_trace() == 0 &&
- mark_compact_collector()
- ->embedder_heap_tracer()
- ->NumberOfWrappersToTrace() == 0));
+ (wrappers_to_trace() == 0 &&
+ embedder_heap_tracer()->NumberOfWrappersToTrace() == 0));
}
void Heap::FinalizeIncrementalMarkingIfComplete(
@@ -5561,15 +5561,36 @@ void Heap::NotifyDeserializationComplete() {
}
void Heap::SetEmbedderHeapTracer(EmbedderHeapTracer* tracer) {
- mark_compact_collector()->SetEmbedderHeapTracer(tracer);
+ DCHECK_NOT_NULL(tracer);
+ CHECK_NULL(embedder_heap_tracer_);
+ embedder_heap_tracer_ = tracer;
}
-bool Heap::UsingEmbedderHeapTracer() {
- return mark_compact_collector()->UsingEmbedderHeapTracer();
+void Heap::RegisterWrappersWithEmbedderHeapTracer() {
+ DCHECK(UsingEmbedderHeapTracer());
+ if (wrappers_to_trace_.empty()) {
+ return;
+ }
+ embedder_heap_tracer()->RegisterV8References(wrappers_to_trace_);
+ wrappers_to_trace_.clear();
}
void Heap::TracePossibleWrapper(JSObject* js_object) {
- mark_compact_collector()->TracePossibleWrapper(js_object);
+ DCHECK(js_object->WasConstructedFromApiFunction());
+ if (js_object->GetInternalFieldCount() >= 2 &&
+ js_object->GetInternalField(0) &&
+ js_object->GetInternalField(0) != undefined_value() &&
+ js_object->GetInternalField(1) != undefined_value()) {
+ DCHECK(reinterpret_cast<intptr_t>(js_object->GetInternalField(0)) % 2 == 0);
+ wrappers_to_trace_.push_back(std::pair<void*, void*>(
+ reinterpret_cast<void*>(js_object->GetInternalField(0)),
+ reinterpret_cast<void*>(js_object->GetInternalField(1))));
+ }
+}
+
+bool Heap::RequiresImmediateWrapperProcessing() {
+ const size_t kTooManyWrappers = 16000;
+ return wrappers_to_trace_.size() > kTooManyWrappers;
}
void Heap::RegisterExternallyReferencedObject(Object** object) {
@@ -5714,6 +5735,9 @@ void Heap::TearDown() {
delete memory_allocator_;
memory_allocator_ = nullptr;
+
+ delete embedder_reference_reporter_;
+ embedder_reference_reporter_ = nullptr;
}
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/incremental-marking.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698