| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/scavenger.h" | 5 #include "vm/scavenger.h" |
| 6 | 6 |
| 7 #include "vm/dart.h" | 7 #include "vm/dart.h" |
| 8 #include "vm/dart_api_state.h" | 8 #include "vm/dart_api_state.h" |
| 9 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
| 10 #include "vm/lockers.h" | 10 #include "vm/lockers.h" |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 // --gc_at_alloc can get us here before the ring has been initialized. | 497 // --gc_at_alloc can get us here before the ring has been initialized. |
| 498 ASSERT(FLAG_gc_at_alloc); | 498 ASSERT(FLAG_gc_at_alloc); |
| 499 return; | 499 return; |
| 500 } | 500 } |
| 501 ring->VisitPointers(visitor); | 501 ring->VisitPointers(visitor); |
| 502 #endif // !PRODUCT | 502 #endif // !PRODUCT |
| 503 } | 503 } |
| 504 | 504 |
| 505 | 505 |
| 506 void Scavenger::IterateRoots(Isolate* isolate, ScavengerVisitor* visitor) { | 506 void Scavenger::IterateRoots(Isolate* isolate, ScavengerVisitor* visitor) { |
| 507 int64_t start = OS::GetCurrentTimeMicros(); | 507 int64_t start = OS::GetCurrentMonotonicMicros(); |
| 508 isolate->VisitObjectPointers(visitor, | 508 isolate->VisitObjectPointers(visitor, |
| 509 StackFrameIterator::kDontValidateFrames); | 509 StackFrameIterator::kDontValidateFrames); |
| 510 int64_t middle = OS::GetCurrentTimeMicros(); | 510 int64_t middle = OS::GetCurrentMonotonicMicros(); |
| 511 IterateStoreBuffers(isolate, visitor); | 511 IterateStoreBuffers(isolate, visitor); |
| 512 IterateObjectIdTable(isolate, visitor); | 512 IterateObjectIdTable(isolate, visitor); |
| 513 int64_t end = OS::GetCurrentTimeMicros(); | 513 int64_t end = OS::GetCurrentMonotonicMicros(); |
| 514 heap_->RecordData(kToKBAfterStoreBuffer, RoundWordsToKB(UsedInWords())); | 514 heap_->RecordData(kToKBAfterStoreBuffer, RoundWordsToKB(UsedInWords())); |
| 515 heap_->RecordTime(kVisitIsolateRoots, middle - start); | 515 heap_->RecordTime(kVisitIsolateRoots, middle - start); |
| 516 heap_->RecordTime(kIterateStoreBuffers, end - middle); | 516 heap_->RecordTime(kIterateStoreBuffers, end - middle); |
| 517 } | 517 } |
| 518 | 518 |
| 519 | 519 |
| 520 bool Scavenger::IsUnreachable(RawObject** p) { | 520 bool Scavenger::IsUnreachable(RawObject** p) { |
| 521 RawObject* raw_obj = *p; | 521 RawObject* raw_obj = *p; |
| 522 if (!raw_obj->IsHeapObject()) { | 522 if (!raw_obj->IsHeapObject()) { |
| 523 return false; | 523 return false; |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 801 (survivor_end_ - FirstObjectStart()) / kWordSize; | 801 (survivor_end_ - FirstObjectStart()) / kWordSize; |
| 802 SemiSpace* from = Prologue(isolate, invoke_api_callbacks); | 802 SemiSpace* from = Prologue(isolate, invoke_api_callbacks); |
| 803 // The API prologue/epilogue may create/destroy zones, so we must not | 803 // The API prologue/epilogue may create/destroy zones, so we must not |
| 804 // depend on zone allocations surviving beyond the epilogue callback. | 804 // depend on zone allocations surviving beyond the epilogue callback. |
| 805 { | 805 { |
| 806 StackZone zone(thread); | 806 StackZone zone(thread); |
| 807 // Setup the visitor and run the scavenge. | 807 // Setup the visitor and run the scavenge. |
| 808 ScavengerVisitor visitor(isolate, this, from); | 808 ScavengerVisitor visitor(isolate, this, from); |
| 809 page_space->AcquireDataLock(); | 809 page_space->AcquireDataLock(); |
| 810 IterateRoots(isolate, &visitor); | 810 IterateRoots(isolate, &visitor); |
| 811 int64_t start = OS::GetCurrentTimeMicros(); | 811 int64_t start = OS::GetCurrentMonotonicMicros(); |
| 812 ProcessToSpace(&visitor); | 812 ProcessToSpace(&visitor); |
| 813 int64_t middle = OS::GetCurrentTimeMicros(); | 813 int64_t middle = OS::GetCurrentMonotonicMicros(); |
| 814 { | 814 { |
| 815 TIMELINE_FUNCTION_GC_DURATION(thread, "WeakHandleProcessing"); | 815 TIMELINE_FUNCTION_GC_DURATION(thread, "WeakHandleProcessing"); |
| 816 if (FLAG_background_finalization) { | 816 if (FLAG_background_finalization) { |
| 817 FinalizationQueue* queue = new FinalizationQueue(); | 817 FinalizationQueue* queue = new FinalizationQueue(); |
| 818 ScavengerWeakVisitor weak_visitor(thread, this, queue); | 818 ScavengerWeakVisitor weak_visitor(thread, this, queue); |
| 819 IterateWeakRoots(isolate, &weak_visitor); | 819 IterateWeakRoots(isolate, &weak_visitor); |
| 820 if (queue->length() > 0) { | 820 if (queue->length() > 0) { |
| 821 Dart::thread_pool()->Run(new BackgroundFinalizer(isolate, queue)); | 821 Dart::thread_pool()->Run(new BackgroundFinalizer(isolate, queue)); |
| 822 } else { | 822 } else { |
| 823 delete queue; | 823 delete queue; |
| 824 } | 824 } |
| 825 } else { | 825 } else { |
| 826 ScavengerWeakVisitor weak_visitor(thread, this, NULL); | 826 ScavengerWeakVisitor weak_visitor(thread, this, NULL); |
| 827 IterateWeakRoots(isolate, &weak_visitor); | 827 IterateWeakRoots(isolate, &weak_visitor); |
| 828 } | 828 } |
| 829 } | 829 } |
| 830 ProcessWeakReferences(); | 830 ProcessWeakReferences(); |
| 831 page_space->ReleaseDataLock(); | 831 page_space->ReleaseDataLock(); |
| 832 | 832 |
| 833 // Scavenge finished. Run accounting. | 833 // Scavenge finished. Run accounting. |
| 834 int64_t end = OS::GetCurrentTimeMicros(); | 834 int64_t end = OS::GetCurrentMonotonicMicros(); |
| 835 heap_->RecordTime(kProcessToSpace, middle - start); | 835 heap_->RecordTime(kProcessToSpace, middle - start); |
| 836 heap_->RecordTime(kIterateWeaks, end - middle); | 836 heap_->RecordTime(kIterateWeaks, end - middle); |
| 837 stats_history_.Add(ScavengeStats( | 837 stats_history_.Add(ScavengeStats( |
| 838 start, end, usage_before, GetCurrentUsage(), promo_candidate_words, | 838 start, end, usage_before, GetCurrentUsage(), promo_candidate_words, |
| 839 visitor.bytes_promoted() >> kWordSizeLog2)); | 839 visitor.bytes_promoted() >> kWordSizeLog2)); |
| 840 } | 840 } |
| 841 Epilogue(isolate, from, invoke_api_callbacks); | 841 Epilogue(isolate, from, invoke_api_callbacks); |
| 842 | 842 |
| 843 // TODO(koda): Make verification more compatible with concurrent sweep. | 843 // TODO(koda): Make verification more compatible with concurrent sweep. |
| 844 if (FLAG_verify_after_gc && !FLAG_concurrent_sweep) { | 844 if (FLAG_verify_after_gc && !FLAG_concurrent_sweep) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 896 } | 896 } |
| 897 | 897 |
| 898 | 898 |
| 899 void Scavenger::FreeExternal(intptr_t size) { | 899 void Scavenger::FreeExternal(intptr_t size) { |
| 900 ASSERT(size >= 0); | 900 ASSERT(size >= 0); |
| 901 external_size_ -= size; | 901 external_size_ -= size; |
| 902 ASSERT(external_size_ >= 0); | 902 ASSERT(external_size_ >= 0); |
| 903 } | 903 } |
| 904 | 904 |
| 905 } // namespace dart | 905 } // namespace dart |
| OLD | NEW |