OLD | NEW |
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/incremental-marking.h" | 7 #include "src/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 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 RecordWriteStub::Patch(Code::cast(e), mode); | 492 RecordWriteStub::Patch(Code::cast(e), mode); |
493 } | 493 } |
494 } | 494 } |
495 } | 495 } |
496 } | 496 } |
497 } | 497 } |
498 | 498 |
499 | 499 |
500 void IncrementalMarking::EnsureMarkingDequeIsCommitted() { | 500 void IncrementalMarking::EnsureMarkingDequeIsCommitted() { |
501 if (marking_deque_memory_ == NULL) { | 501 if (marking_deque_memory_ == NULL) { |
502 marking_deque_memory_ = new VirtualMemory(4 * MB); | 502 marking_deque_memory_ = new base::VirtualMemory(4 * MB); |
503 } | 503 } |
504 if (!marking_deque_memory_committed_) { | 504 if (!marking_deque_memory_committed_) { |
505 bool success = marking_deque_memory_->Commit( | 505 bool success = marking_deque_memory_->Commit( |
506 reinterpret_cast<Address>(marking_deque_memory_->address()), | 506 reinterpret_cast<Address>(marking_deque_memory_->address()), |
507 marking_deque_memory_->size(), | 507 marking_deque_memory_->size(), |
508 false); // Not executable. | 508 false); // Not executable. |
509 CHECK(success); | 509 CHECK(success); |
510 marking_deque_memory_committed_ = true; | 510 marking_deque_memory_committed_ = true; |
511 } | 511 } |
512 } | 512 } |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 | 716 |
717 VisitObject(map, obj, obj->SizeFromMap(map)); | 717 VisitObject(map, obj, obj->SizeFromMap(map)); |
718 } | 718 } |
719 } | 719 } |
720 | 720 |
721 | 721 |
722 void IncrementalMarking::Hurry() { | 722 void IncrementalMarking::Hurry() { |
723 if (state() == MARKING) { | 723 if (state() == MARKING) { |
724 double start = 0.0; | 724 double start = 0.0; |
725 if (FLAG_trace_incremental_marking || FLAG_print_cumulative_gc_stat) { | 725 if (FLAG_trace_incremental_marking || FLAG_print_cumulative_gc_stat) { |
726 start = OS::TimeCurrentMillis(); | 726 start = base::OS::TimeCurrentMillis(); |
727 if (FLAG_trace_incremental_marking) { | 727 if (FLAG_trace_incremental_marking) { |
728 PrintF("[IncrementalMarking] Hurry\n"); | 728 PrintF("[IncrementalMarking] Hurry\n"); |
729 } | 729 } |
730 } | 730 } |
731 // TODO(gc) hurry can mark objects it encounters black as mutator | 731 // TODO(gc) hurry can mark objects it encounters black as mutator |
732 // was stopped. | 732 // was stopped. |
733 ProcessMarkingDeque(); | 733 ProcessMarkingDeque(); |
734 state_ = COMPLETE; | 734 state_ = COMPLETE; |
735 if (FLAG_trace_incremental_marking || FLAG_print_cumulative_gc_stat) { | 735 if (FLAG_trace_incremental_marking || FLAG_print_cumulative_gc_stat) { |
736 double end = OS::TimeCurrentMillis(); | 736 double end = base::OS::TimeCurrentMillis(); |
737 double delta = end - start; | 737 double delta = end - start; |
738 heap_->AddMarkingTime(delta); | 738 heap_->AddMarkingTime(delta); |
739 if (FLAG_trace_incremental_marking) { | 739 if (FLAG_trace_incremental_marking) { |
740 PrintF("[IncrementalMarking] Complete (hurry), spent %d ms.\n", | 740 PrintF("[IncrementalMarking] Complete (hurry), spent %d ms.\n", |
741 static_cast<int>(delta)); | 741 static_cast<int>(delta)); |
742 } | 742 } |
743 } | 743 } |
744 } | 744 } |
745 | 745 |
746 if (FLAG_cleanup_code_caches_at_gc) { | 746 if (FLAG_cleanup_code_caches_at_gc) { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
869 marking_speed_ * Max(allocated_, write_barriers_invoked_since_last_step_); | 869 marking_speed_ * Max(allocated_, write_barriers_invoked_since_last_step_); |
870 allocated_ = 0; | 870 allocated_ = 0; |
871 write_barriers_invoked_since_last_step_ = 0; | 871 write_barriers_invoked_since_last_step_ = 0; |
872 | 872 |
873 bytes_scanned_ += bytes_to_process; | 873 bytes_scanned_ += bytes_to_process; |
874 | 874 |
875 double start = 0; | 875 double start = 0; |
876 | 876 |
877 if (FLAG_trace_incremental_marking || FLAG_trace_gc || | 877 if (FLAG_trace_incremental_marking || FLAG_trace_gc || |
878 FLAG_print_cumulative_gc_stat) { | 878 FLAG_print_cumulative_gc_stat) { |
879 start = OS::TimeCurrentMillis(); | 879 start = base::OS::TimeCurrentMillis(); |
880 } | 880 } |
881 | 881 |
882 if (state_ == SWEEPING) { | 882 if (state_ == SWEEPING) { |
883 if (heap_->mark_compact_collector()->IsConcurrentSweepingInProgress() && | 883 if (heap_->mark_compact_collector()->IsConcurrentSweepingInProgress() && |
884 heap_->mark_compact_collector()->IsSweepingCompleted()) { | 884 heap_->mark_compact_collector()->IsSweepingCompleted()) { |
885 heap_->mark_compact_collector()->WaitUntilSweepingCompleted(); | 885 heap_->mark_compact_collector()->WaitUntilSweepingCompleted(); |
886 } | 886 } |
887 if (!heap_->mark_compact_collector()->IsConcurrentSweepingInProgress()) { | 887 if (!heap_->mark_compact_collector()->IsConcurrentSweepingInProgress()) { |
888 bytes_scanned_ = 0; | 888 bytes_scanned_ = 0; |
889 StartMarking(PREVENT_COMPACTION); | 889 StartMarking(PREVENT_COMPACTION); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 Min(kMaxMarkingSpeed, | 954 Min(kMaxMarkingSpeed, |
955 static_cast<intptr_t>(marking_speed_ * 1.3))); | 955 static_cast<intptr_t>(marking_speed_ * 1.3))); |
956 if (FLAG_trace_gc) { | 956 if (FLAG_trace_gc) { |
957 PrintPID("Marking speed increased to %d\n", marking_speed_); | 957 PrintPID("Marking speed increased to %d\n", marking_speed_); |
958 } | 958 } |
959 } | 959 } |
960 } | 960 } |
961 | 961 |
962 if (FLAG_trace_incremental_marking || FLAG_trace_gc || | 962 if (FLAG_trace_incremental_marking || FLAG_trace_gc || |
963 FLAG_print_cumulative_gc_stat) { | 963 FLAG_print_cumulative_gc_stat) { |
964 double end = OS::TimeCurrentMillis(); | 964 double end = base::OS::TimeCurrentMillis(); |
965 double delta = (end - start); | 965 double delta = (end - start); |
966 longest_step_ = Max(longest_step_, delta); | 966 longest_step_ = Max(longest_step_, delta); |
967 steps_took_ += delta; | 967 steps_took_ += delta; |
968 steps_took_since_last_gc_ += delta; | 968 steps_took_since_last_gc_ += delta; |
969 heap_->AddMarkingTime(delta); | 969 heap_->AddMarkingTime(delta); |
970 } | 970 } |
971 } | 971 } |
972 | 972 |
973 | 973 |
974 void IncrementalMarking::ResetStepCounters() { | 974 void IncrementalMarking::ResetStepCounters() { |
(...skipping 11 matching lines...) Expand all Loading... |
986 bytes_scanned_ = 0; | 986 bytes_scanned_ = 0; |
987 write_barriers_invoked_since_last_step_ = 0; | 987 write_barriers_invoked_since_last_step_ = 0; |
988 } | 988 } |
989 | 989 |
990 | 990 |
991 int64_t IncrementalMarking::SpaceLeftInOldSpace() { | 991 int64_t IncrementalMarking::SpaceLeftInOldSpace() { |
992 return heap_->MaxOldGenerationSize() - heap_->PromotedSpaceSizeOfObjects(); | 992 return heap_->MaxOldGenerationSize() - heap_->PromotedSpaceSizeOfObjects(); |
993 } | 993 } |
994 | 994 |
995 } } // namespace v8::internal | 995 } } // namespace v8::internal |
OLD | NEW |