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

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

Issue 1265423002: Use idle task to perform incremental marking steps. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add tracing Created 5 years, 4 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
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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/heap/incremental-marking.h" 7 #include "src/heap/incremental-marking.h"
8 8
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/compilation-cache.h" 10 #include "src/compilation-cache.h"
(...skipping 25 matching lines...) Expand all
36 bytes_scanned_(0), 36 bytes_scanned_(0),
37 allocated_(0), 37 allocated_(0),
38 write_barriers_invoked_since_last_step_(0), 38 write_barriers_invoked_since_last_step_(0),
39 idle_marking_delay_counter_(0), 39 idle_marking_delay_counter_(0),
40 no_marking_scope_depth_(0), 40 no_marking_scope_depth_(0),
41 unscanned_bytes_of_large_object_(0), 41 unscanned_bytes_of_large_object_(0),
42 was_activated_(false), 42 was_activated_(false),
43 weak_closure_was_overapproximated_(false), 43 weak_closure_was_overapproximated_(false),
44 weak_closure_approximation_rounds_(0), 44 weak_closure_approximation_rounds_(0),
45 request_type_(COMPLETE_MARKING), 45 request_type_(COMPLETE_MARKING),
46 gc_callback_flags_(kNoGCCallbackFlags) {} 46 gc_callback_flags_(kNoGCCallbackFlags),
47 pending_incremental_marking_task_(false) {}
47 48
48 49
49 void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot, 50 void IncrementalMarking::RecordWriteSlow(HeapObject* obj, Object** slot,
50 Object* value) { 51 Object* value) {
51 if (BaseRecordWrite(obj, slot, value) && slot != NULL) { 52 if (BaseRecordWrite(obj, slot, value) && slot != NULL) {
52 MarkBit obj_bit = Marking::MarkBitFrom(obj); 53 MarkBit obj_bit = Marking::MarkBitFrom(obj);
53 if (Marking::IsBlack(obj_bit)) { 54 if (Marking::IsBlack(obj_bit)) {
54 // Object is not going to be rescanned we need to record the slot. 55 // Object is not going to be rescanned we need to record the slot.
55 heap_->mark_compact_collector()->RecordSlot(obj, slot, value); 56 heap_->mark_compact_collector()->RecordSlot(obj, slot, value);
56 } 57 }
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 StartMarking(); 494 StartMarking();
494 heap_->mark_compact_collector()->SetFlags(Heap::kNoGCFlags); 495 heap_->mark_compact_collector()->SetFlags(Heap::kNoGCFlags);
495 } else { 496 } else {
496 if (FLAG_trace_incremental_marking) { 497 if (FLAG_trace_incremental_marking) {
497 PrintF("[IncrementalMarking] Start sweeping.\n"); 498 PrintF("[IncrementalMarking] Start sweeping.\n");
498 } 499 }
499 state_ = SWEEPING; 500 state_ = SWEEPING;
500 } 501 }
501 502
502 heap_->new_space()->LowerInlineAllocationLimit(kAllocatedThreshold); 503 heap_->new_space()->LowerInlineAllocationLimit(kAllocatedThreshold);
504 ScheduleIncrementalMarkingTask();
503 } 505 }
504 506
505 507
506 void IncrementalMarking::StartMarking() { 508 void IncrementalMarking::StartMarking() {
507 if (FLAG_trace_incremental_marking) { 509 if (FLAG_trace_incremental_marking) {
508 PrintF("[IncrementalMarking] Start marking\n"); 510 PrintF("[IncrementalMarking] Start marking\n");
509 } 511 }
510 512
511 is_compacting_ = !FLAG_never_compact && 513 is_compacting_ = !FLAG_never_compact &&
512 heap_->mark_compact_collector()->StartCompaction( 514 heap_->mark_compact_collector()->StartCompaction(
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
1023 1025
1024 1026
1025 void IncrementalMarking::IncrementIdleMarkingDelayCounter() { 1027 void IncrementalMarking::IncrementIdleMarkingDelayCounter() {
1026 idle_marking_delay_counter_++; 1028 idle_marking_delay_counter_++;
1027 } 1029 }
1028 1030
1029 1031
1030 void IncrementalMarking::ClearIdleMarkingDelayCounter() { 1032 void IncrementalMarking::ClearIdleMarkingDelayCounter() {
1031 idle_marking_delay_counter_ = 0; 1033 idle_marking_delay_counter_ = 0;
1032 } 1034 }
1035
1036
1037 void IncrementalMarking::ScheduleIncrementalMarkingTask() {
1038 if (!pending_incremental_marking_task_) {
1039 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(heap_->isolate());
1040 if (V8::GetCurrentPlatform()->IdleTasksEnabled(isolate)) {
1041 pending_incremental_marking_task_ = true;
1042 auto task = new IncrementalMarkingTask(heap_->isolate());
1043 V8::GetCurrentPlatform()->CallIdleOnForegroundThread(isolate, task);
1044 }
1045 }
1046 }
1047
1048
1049 void IncrementalMarking::NotifyIncrementalMarkingTaskRunning() {
1050 pending_incremental_marking_task_ = false;
1051 }
1052
1053
1054 IncrementalMarkingTask::Progress IncrementalMarkingTask::Step(
1055 Heap* heap, double deadline_in_ms) {
1056 IncrementalMarking* incremental_marking = heap->incremental_marking();
1057 MarkCompactCollector* mark_compact_collector = heap->mark_compact_collector();
1058 if (incremental_marking->IsStopped()) {
1059 return kDone;
1060 }
1061 if (mark_compact_collector->sweeping_in_progress()) {
1062 if (mark_compact_collector->IsSweepingCompleted()) {
1063 mark_compact_collector->EnsureSweepingCompleted();
1064 }
Hannes Payer (out of office) 2015/08/05 12:35:44 A follow-up CL could check if there is still time
ulan 2015/08/05 12:45:40 Acknowledged.
1065 return kMoreWork;
1066 }
1067 const double remaining_idle_time_in_ms = heap->AdvanceIncrementalMarking(
Hannes Payer (out of office) 2015/08/05 12:35:44 AdvanceIncrementalMarking is always called with st
ulan 2015/08/05 12:45:40 I'll do it in a separate CL to avoid conflicts wit
1068 0, deadline_in_ms, IncrementalMarking::NoForcedStepActions());
1069 if (remaining_idle_time_in_ms > 0.0) {
1070 heap->TryFinalizeIdleIncrementalMarking(remaining_idle_time_in_ms);
1071 }
1072 return incremental_marking->IsStopped() ? kDone : kMoreWork;
1073 }
1074
1075
1076 void IncrementalMarkingTask::RunInternal(double deadline_in_seconds) {
1077 double deadline_in_ms =
1078 deadline_in_seconds *
1079 static_cast<double>(base::Time::kMillisecondsPerSecond);
1080 Heap* heap = isolate_->heap();
1081 double start_ms = heap->MonotonicallyIncreasingTimeInMs();
1082 heap->incremental_marking()->NotifyIncrementalMarkingTaskRunning();
1083 if (Step(heap, deadline_in_ms) == kMoreWork) {
1084 heap->incremental_marking()->ScheduleIncrementalMarkingTask();
1085 }
1086 if (FLAG_trace_idle_notification) {
1087 double current_time_ms = heap->MonotonicallyIncreasingTimeInMs();
1088 double idle_time_in_ms = deadline_in_ms - start_ms;
1089 double deadline_difference = deadline_in_ms - current_time_ms;
1090 PrintIsolate(isolate_, "%8.0f ms: ", isolate_->time_millis_since_init());
1091 PrintF(
1092 "Idle task: requested idle time %.2f ms, used idle time %.2f "
1093 "ms, deadline usage %.2f ms\n",
1094 idle_time_in_ms, idle_time_in_ms - deadline_difference,
1095 deadline_difference);
1096 }
1097 }
1098
1033 } // namespace internal 1099 } // namespace internal
1034 } // namespace v8 1100 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698