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

Side by Side Diff: src/heap/incremental-marking.cc

Issue 2371733002: Introduce EmbedderReachableReferenceReporter (Closed)
Patch Set: Fix UsingEmbedderHeapTracer Created 4 years, 2 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 unified diff | Download patch
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/mark-compact.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/heap/incremental-marking.h" 5 #include "src/heap/incremental-marking.h"
6 6
7 #include "src/code-stubs.h" 7 #include "src/code-stubs.h"
8 #include "src/compilation-cache.h" 8 #include "src/compilation-cache.h"
9 #include "src/conversions.h" 9 #include "src/conversions.h"
10 #include "src/heap/gc-idle-time-handler.h" 10 #include "src/heap/gc-idle-time-handler.h"
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 562
563 is_compacting_ = !FLAG_never_compact && 563 is_compacting_ = !FLAG_never_compact &&
564 heap_->mark_compact_collector()->StartCompaction( 564 heap_->mark_compact_collector()->StartCompaction(
565 MarkCompactCollector::INCREMENTAL_COMPACTION); 565 MarkCompactCollector::INCREMENTAL_COMPACTION);
566 566
567 state_ = MARKING; 567 state_ = MARKING;
568 568
569 if (heap_->UsingEmbedderHeapTracer()) { 569 if (heap_->UsingEmbedderHeapTracer()) {
570 TRACE_GC(heap()->tracer(), 570 TRACE_GC(heap()->tracer(),
571 GCTracer::Scope::MC_INCREMENTAL_WRAPPER_PROLOGUE); 571 GCTracer::Scope::MC_INCREMENTAL_WRAPPER_PROLOGUE);
572 heap_->mark_compact_collector()->embedder_heap_tracer()->TracePrologue(); 572 heap_->embedder_heap_tracer()->TracePrologue(
573 heap_->embedder_reachable_reference_reporter());
573 } 574 }
574 575
575 RecordWriteStub::Mode mode = is_compacting_ 576 RecordWriteStub::Mode mode = is_compacting_
576 ? RecordWriteStub::INCREMENTAL_COMPACTION 577 ? RecordWriteStub::INCREMENTAL_COMPACTION
577 : RecordWriteStub::INCREMENTAL; 578 : RecordWriteStub::INCREMENTAL;
578 579
579 PatchIncrementalMarkingRecordWriteStubs(heap_, mode); 580 PatchIncrementalMarkingRecordWriteStubs(heap_, mode);
580 581
581 heap_->mark_compact_collector()->EnsureMarkingDequeIsCommittedAndInitialize( 582 heap_->mark_compact_collector()->EnsureMarkingDequeIsCommittedAndInitialize(
582 MarkCompactCollector::kMaxMarkingDequeSize); 583 MarkCompactCollector::kMaxMarkingDequeSize);
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 // Map retaining is needed for perfromance, not correctness, 790 // Map retaining is needed for perfromance, not correctness,
790 // so we can do it only once at the beginning of the finalization. 791 // so we can do it only once at the beginning of the finalization.
791 RetainMaps(); 792 RetainMaps();
792 } 793 }
793 ProcessWeakCells(); 794 ProcessWeakCells();
794 795
795 int marking_progress = 796 int marking_progress =
796 abs(old_marking_deque_top - 797 abs(old_marking_deque_top -
797 heap_->mark_compact_collector()->marking_deque()->top()); 798 heap_->mark_compact_collector()->marking_deque()->top());
798 799
799 marking_progress += 800 marking_progress += static_cast<int>(heap_->wrappers_to_trace());
800 static_cast<int>(heap_->mark_compact_collector()->wrappers_to_trace());
801 801
802 double end = heap_->MonotonicallyIncreasingTimeInMs(); 802 double end = heap_->MonotonicallyIncreasingTimeInMs();
803 double delta = end - start; 803 double delta = end - start;
804 heap_->tracer()->AddMarkingTime(delta); 804 heap_->tracer()->AddMarkingTime(delta);
805 if (FLAG_trace_incremental_marking) { 805 if (FLAG_trace_incremental_marking) {
806 heap()->isolate()->PrintWithTimestamp( 806 heap()->isolate()->PrintWithTimestamp(
807 "[IncrementalMarking] Finalize incrementally round %d, " 807 "[IncrementalMarking] Finalize incrementally round %d, "
808 "spent %d ms, marking progress %d.\n", 808 "spent %d ms, marking progress %d.\n",
809 static_cast<int>(delta), incremental_marking_finalization_rounds_, 809 static_cast<int>(delta), incremental_marking_finalization_rounds_,
810 marking_progress); 810 marking_progress);
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 TRACE_GC(heap_->tracer(), GCTracer::Scope::MC_INCREMENTAL_SWEEPING); 1219 TRACE_GC(heap_->tracer(), GCTracer::Scope::MC_INCREMENTAL_SWEEPING);
1220 FinalizeSweeping(); 1220 FinalizeSweeping();
1221 } 1221 }
1222 1222
1223 intptr_t bytes_processed = 0; 1223 intptr_t bytes_processed = 0;
1224 if (state_ == MARKING) { 1224 if (state_ == MARKING) {
1225 const bool incremental_wrapper_tracing = 1225 const bool incremental_wrapper_tracing =
1226 FLAG_incremental_marking_wrappers && heap_->UsingEmbedderHeapTracer(); 1226 FLAG_incremental_marking_wrappers && heap_->UsingEmbedderHeapTracer();
1227 const bool process_wrappers = 1227 const bool process_wrappers =
1228 incremental_wrapper_tracing && 1228 incremental_wrapper_tracing &&
1229 (heap_->mark_compact_collector() 1229 (heap_->RequiresImmediateWrapperProcessing() ||
1230 ->RequiresImmediateWrapperProcessing() ||
1231 heap_->mark_compact_collector()->marking_deque()->IsEmpty()); 1230 heap_->mark_compact_collector()->marking_deque()->IsEmpty());
1232 bool wrapper_work_left = incremental_wrapper_tracing; 1231 bool wrapper_work_left = incremental_wrapper_tracing;
1233 if (!process_wrappers) { 1232 if (!process_wrappers) {
1234 if (step_origin == StepOrigin::kV8 && 1233 if (step_origin == StepOrigin::kV8 &&
1235 bytes_marked_ahead_of_schedule_ >= bytes_to_process) { 1234 bytes_marked_ahead_of_schedule_ >= bytes_to_process) {
1236 // Steps performed in tasks have put us ahead of schedule. 1235 // Steps performed in tasks have put us ahead of schedule.
1237 // We skip processing of marking dequeue here and thus 1236 // We skip processing of marking dequeue here and thus
1238 // shift marking time from inside V8 to standalone tasks. 1237 // shift marking time from inside V8 to standalone tasks.
1239 bytes_marked_ahead_of_schedule_ -= bytes_to_process; 1238 bytes_marked_ahead_of_schedule_ -= bytes_to_process;
1240 } else { 1239 } else {
1241 bytes_processed = ProcessMarkingDeque(bytes_to_process); 1240 bytes_processed = ProcessMarkingDeque(bytes_to_process);
1242 if (step_origin == StepOrigin::kTask) { 1241 if (step_origin == StepOrigin::kTask) {
1243 bytes_marked_ahead_of_schedule_ += bytes_processed; 1242 bytes_marked_ahead_of_schedule_ += bytes_processed;
1244 } 1243 }
1245 } 1244 }
1246 } else { 1245 } else {
1247 const double wrapper_deadline = 1246 const double wrapper_deadline =
1248 heap_->MonotonicallyIncreasingTimeInMs() + kStepSizeInMs; 1247 heap_->MonotonicallyIncreasingTimeInMs() + kStepSizeInMs;
1249 TRACE_GC(heap()->tracer(), 1248 TRACE_GC(heap()->tracer(),
1250 GCTracer::Scope::MC_INCREMENTAL_WRAPPER_TRACING); 1249 GCTracer::Scope::MC_INCREMENTAL_WRAPPER_TRACING);
1251 heap_->mark_compact_collector()->RegisterWrappersWithEmbedderHeapTracer(); 1250 heap_->RegisterWrappersWithEmbedderHeapTracer();
1252 wrapper_work_left = 1251 wrapper_work_left = heap_->embedder_heap_tracer()->AdvanceTracing(
1253 heap_->mark_compact_collector() 1252 wrapper_deadline, EmbedderHeapTracer::AdvanceTracingActions(
1254 ->embedder_heap_tracer() 1253 EmbedderHeapTracer::ForceCompletionAction::
1255 ->AdvanceTracing(wrapper_deadline, 1254 DO_NOT_FORCE_COMPLETION));
1256 EmbedderHeapTracer::AdvanceTracingActions(
1257 EmbedderHeapTracer::ForceCompletionAction::
1258 DO_NOT_FORCE_COMPLETION));
1259 } 1255 }
1260 1256
1261 if (heap_->mark_compact_collector()->marking_deque()->IsEmpty() && 1257 if (heap_->mark_compact_collector()->marking_deque()->IsEmpty() &&
1262 !wrapper_work_left) { 1258 !wrapper_work_left) {
1263 if (completion == FORCE_COMPLETION || 1259 if (completion == FORCE_COMPLETION ||
1264 IsIdleMarkingDelayCounterLimitReached()) { 1260 IsIdleMarkingDelayCounterLimitReached()) {
1265 if (!finalize_marking_completed_) { 1261 if (!finalize_marking_completed_) {
1266 FinalizeMarking(action); 1262 FinalizeMarking(action);
1267 } else { 1263 } else {
1268 MarkingComplete(action); 1264 MarkingComplete(action);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 idle_marking_delay_counter_++; 1319 idle_marking_delay_counter_++;
1324 } 1320 }
1325 1321
1326 1322
1327 void IncrementalMarking::ClearIdleMarkingDelayCounter() { 1323 void IncrementalMarking::ClearIdleMarkingDelayCounter() {
1328 idle_marking_delay_counter_ = 0; 1324 idle_marking_delay_counter_ = 0;
1329 } 1325 }
1330 1326
1331 } // namespace internal 1327 } // namespace internal
1332 } // namespace v8 1328 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.cc ('k') | src/heap/mark-compact.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698