[heap] Add basic infrastructure for incremental wrapper tracing.
BUG=chromium:468240 Review-Url: https://codereview.chromium.org/2245133004 Cr-Commit-Position: refs/heads/master@{#38702}
This commit is contained in:
parent
074aa90ca5
commit
03d5f87597
@ -740,6 +740,8 @@ DEFINE_BOOL(age_code, true,
|
|||||||
"track un-executed functions to age code and flush only "
|
"track un-executed functions to age code and flush only "
|
||||||
"old code (required for code flushing)")
|
"old code (required for code flushing)")
|
||||||
DEFINE_BOOL(incremental_marking, true, "use incremental marking")
|
DEFINE_BOOL(incremental_marking, true, "use incremental marking")
|
||||||
|
DEFINE_BOOL(incremental_marking_wrappers, true,
|
||||||
|
"use incremental marking for marking wrappers")
|
||||||
DEFINE_INT(min_progress_during_incremental_marking_finalization, 32,
|
DEFINE_INT(min_progress_during_incremental_marking_finalization, 32,
|
||||||
"keep finalizing incremental marking as long as we discover at "
|
"keep finalizing incremental marking as long as we discover at "
|
||||||
"least this many unmarked objects")
|
"least this many unmarked objects")
|
||||||
|
@ -5454,7 +5454,15 @@ void Heap::TracePossibleWrapper(JSObject* js_object) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Heap::RegisterExternallyReferencedObject(Object** object) {
|
void Heap::RegisterExternallyReferencedObject(Object** object) {
|
||||||
mark_compact_collector()->RegisterExternallyReferencedObject(object);
|
HeapObject* heap_object = HeapObject::cast(*object);
|
||||||
|
DCHECK(Contains(heap_object));
|
||||||
|
if (FLAG_incremental_marking_wrappers && incremental_marking()->IsMarking()) {
|
||||||
|
IncrementalMarking::MarkGrey(this, heap_object);
|
||||||
|
} else {
|
||||||
|
DCHECK(mark_compact_collector()->in_use());
|
||||||
|
MarkBit mark_bit = ObjectMarking::MarkBitFrom(heap_object);
|
||||||
|
mark_compact_collector()->MarkObject(heap_object, mark_bit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Heap::TearDown() {
|
void Heap::TearDown() {
|
||||||
|
@ -1201,6 +1201,19 @@ intptr_t IncrementalMarking::Step(intptr_t allocated_bytes,
|
|||||||
|
|
||||||
if (state_ == MARKING) {
|
if (state_ == MARKING) {
|
||||||
bytes_processed = ProcessMarkingDeque(bytes_to_process);
|
bytes_processed = ProcessMarkingDeque(bytes_to_process);
|
||||||
|
if (FLAG_incremental_marking_wrappers &&
|
||||||
|
heap_->UsingEmbedderHeapTracer()) {
|
||||||
|
// This currently marks through all registered wrappers and does not
|
||||||
|
// respect bytes_to_process.
|
||||||
|
// TODO(hpayer): Integrate incremental marking of wrappers into
|
||||||
|
// bytes_to_process logic.
|
||||||
|
heap_->mark_compact_collector()
|
||||||
|
->RegisterWrappersWithEmbedderHeapTracer();
|
||||||
|
heap_->mark_compact_collector()->embedder_heap_tracer()->AdvanceTracing(
|
||||||
|
0,
|
||||||
|
EmbedderHeapTracer::AdvanceTracingActions(
|
||||||
|
EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION));
|
||||||
|
}
|
||||||
if (heap_->mark_compact_collector()->marking_deque()->IsEmpty()) {
|
if (heap_->mark_compact_collector()->marking_deque()->IsEmpty()) {
|
||||||
if (completion == FORCE_COMPLETION ||
|
if (completion == FORCE_COMPLETION ||
|
||||||
IsIdleMarkingDelayCounterLimitReached()) {
|
IsIdleMarkingDelayCounterLimitReached()) {
|
||||||
|
@ -2223,14 +2223,6 @@ void MarkCompactCollector::TracePossibleWrapper(JSObject* js_object) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarkCompactCollector::RegisterExternallyReferencedObject(Object** object) {
|
|
||||||
DCHECK(in_use());
|
|
||||||
HeapObject* heap_object = HeapObject::cast(*object);
|
|
||||||
DCHECK(heap_->Contains(heap_object));
|
|
||||||
MarkBit mark_bit = ObjectMarking::MarkBitFrom(heap_object);
|
|
||||||
MarkObject(heap_object, mark_bit);
|
|
||||||
}
|
|
||||||
|
|
||||||
class MarkCompactCollector::ObjectStatsVisitor
|
class MarkCompactCollector::ObjectStatsVisitor
|
||||||
: public MarkCompactCollector::HeapObjectVisitor {
|
: public MarkCompactCollector::HeapObjectVisitor {
|
||||||
public:
|
public:
|
||||||
|
@ -500,8 +500,6 @@ class MarkCompactCollector {
|
|||||||
|
|
||||||
void TracePossibleWrapper(JSObject* js_object);
|
void TracePossibleWrapper(JSObject* js_object);
|
||||||
|
|
||||||
void RegisterExternallyReferencedObject(Object** object);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class EvacuateNewSpacePageVisitor;
|
class EvacuateNewSpacePageVisitor;
|
||||||
class EvacuateNewSpaceVisitor;
|
class EvacuateNewSpaceVisitor;
|
||||||
|
Loading…
Reference in New Issue
Block a user