| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "vm/dart.h" | 11 #include "vm/dart.h" |
| 12 #include "vm/dart_api_state.h" | 12 #include "vm/dart_api_state.h" |
| 13 #include "vm/isolate.h" | 13 #include "vm/isolate.h" |
| 14 #include "vm/object.h" | 14 #include "vm/object.h" |
| 15 #include "vm/stack_frame.h" | 15 #include "vm/stack_frame.h" |
| 16 #include "vm/store_buffer.h" | 16 #include "vm/store_buffer.h" |
| 17 #include "vm/verifier.h" | 17 #include "vm/verifier.h" |
| 18 #include "vm/visitor.h" | 18 #include "vm/visitor.h" |
| 19 #include "vm/weak_table.h" | 19 #include "vm/weak_table.h" |
| 20 #include "vm/object_id_ring.h" | 20 #include "vm/object_id_ring.h" |
| 21 | 21 |
| 22 namespace dart { | 22 namespace dart { |
| 23 | 23 |
| 24 DEFINE_FLAG(int, early_tenuring_threshold, 66, "Skip TO space when promoting" |
| 25 " above this percentage."); |
| 26 |
| 24 // Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded | 27 // Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded |
| 25 // objects. The kMarkBit does not intersect with the target address because of | 28 // objects. The kMarkBit does not intersect with the target address because of |
| 26 // object alignment. | 29 // object alignment. |
| 27 enum { | 30 enum { |
| 28 kForwardingMask = 1 << RawObject::kMarkBit, | 31 kForwardingMask = 1 << RawObject::kMarkBit, |
| 29 kNotForwarded = 0, | 32 kNotForwarded = 0, |
| 30 kForwarded = kForwardingMask, | 33 kForwarded = kForwardingMask, |
| 31 }; | 34 }; |
| 32 | 35 |
| 33 | 36 |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 // objects. | 365 // objects. |
| 363 MemoryRegion* temp = from_; | 366 MemoryRegion* temp = from_; |
| 364 from_ = to_; | 367 from_ = to_; |
| 365 to_ = temp; | 368 to_ = temp; |
| 366 top_ = FirstObjectStart(); | 369 top_ = FirstObjectStart(); |
| 367 resolved_top_ = top_; | 370 resolved_top_ = top_; |
| 368 end_ = to_->end(); | 371 end_ = to_->end(); |
| 369 } | 372 } |
| 370 | 373 |
| 371 | 374 |
| 372 void Scavenger::Epilogue(Isolate* isolate, bool invoke_api_callbacks) { | 375 void Scavenger::Epilogue(Isolate* isolate, |
| 376 ScavengerVisitor* visitor, |
| 377 bool invoke_api_callbacks) { |
| 373 // All objects in the to space have been copied from the from space at this | 378 // All objects in the to space have been copied from the from space at this |
| 374 // moment. | 379 // moment. |
| 375 survivor_end_ = top_; | 380 int promotion_ratio = static_cast<int>( |
| 381 (static_cast<double>(visitor->bytes_promoted()) / |
| 382 static_cast<double>(to_->size())) * 100.0); |
| 383 if (promotion_ratio < FLAG_early_tenuring_threshold) { |
| 384 // Remember the limit to which objects have been copied. |
| 385 survivor_end_ = top_; |
| 386 } else { |
| 387 // Move survivor end to the end of the to_ space, making all surviving |
| 388 // objects candidates for promotion. |
| 389 survivor_end_ = end_; |
| 390 } |
| 376 | 391 |
| 377 #if defined(DEBUG) | 392 #if defined(DEBUG) |
| 378 VerifyStoreBufferPointerVisitor verify_store_buffer_visitor(isolate, to_); | 393 VerifyStoreBufferPointerVisitor verify_store_buffer_visitor(isolate, to_); |
| 379 heap_->IterateOldPointers(&verify_store_buffer_visitor); | 394 heap_->IterateOldPointers(&verify_store_buffer_visitor); |
| 380 | 395 |
| 381 memset(from_->pointer(), 0xf3, from_->size()); | 396 memset(from_->pointer(), 0xf3, from_->size()); |
| 382 #endif // defined(DEBUG) | 397 #endif // defined(DEBUG) |
| 383 if (invoke_api_callbacks) { | 398 if (invoke_api_callbacks) { |
| 384 isolate->gc_epilogue_callbacks().Invoke(); | 399 isolate->gc_epilogue_callbacks().Invoke(); |
| 385 } | 400 } |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 ProcessToSpace(&visitor); | 681 ProcessToSpace(&visitor); |
| 667 int64_t middle = OS::GetCurrentTimeMicros(); | 682 int64_t middle = OS::GetCurrentTimeMicros(); |
| 668 IterateWeakReferences(isolate, &visitor); | 683 IterateWeakReferences(isolate, &visitor); |
| 669 ScavengerWeakVisitor weak_visitor(this); | 684 ScavengerWeakVisitor weak_visitor(this); |
| 670 IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks); | 685 IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks); |
| 671 visitor.Finalize(); | 686 visitor.Finalize(); |
| 672 ProcessWeakTables(); | 687 ProcessWeakTables(); |
| 673 int64_t end = OS::GetCurrentTimeMicros(); | 688 int64_t end = OS::GetCurrentTimeMicros(); |
| 674 heap_->RecordTime(kProcessToSpace, middle - start); | 689 heap_->RecordTime(kProcessToSpace, middle - start); |
| 675 heap_->RecordTime(kIterateWeaks, end - middle); | 690 heap_->RecordTime(kIterateWeaks, end - middle); |
| 676 Epilogue(isolate, invoke_api_callbacks); | 691 Epilogue(isolate, &visitor, invoke_api_callbacks); |
| 677 | 692 |
| 678 if (FLAG_verify_after_gc) { | 693 if (FLAG_verify_after_gc) { |
| 679 OS::PrintErr("Verifying after Scavenge..."); | 694 OS::PrintErr("Verifying after Scavenge..."); |
| 680 heap_->Verify(); | 695 heap_->Verify(); |
| 681 OS::PrintErr(" done.\n"); | 696 OS::PrintErr(" done.\n"); |
| 682 } | 697 } |
| 683 | 698 |
| 684 // Done scavenging. Reset the marker. | 699 // Done scavenging. Reset the marker. |
| 685 ASSERT(scavenging_); | 700 ASSERT(scavenging_); |
| 686 scavenging_ = false; | 701 scavenging_ = false; |
| 687 } | 702 } |
| 688 | 703 |
| 689 | 704 |
| 690 void Scavenger::WriteProtect(bool read_only) { | 705 void Scavenger::WriteProtect(bool read_only) { |
| 691 space_->Protect( | 706 space_->Protect( |
| 692 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite); | 707 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite); |
| 693 } | 708 } |
| 694 | 709 |
| 695 | 710 |
| 696 } // namespace dart | 711 } // namespace dart |
| OLD | NEW |