| 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 <map> | 8 #include <map> |
| 8 #include <utility> | 9 #include <utility> |
| 9 | 10 |
| 10 #include "vm/dart.h" | 11 #include "vm/dart.h" |
| 11 #include "vm/dart_api_state.h" | 12 #include "vm/dart_api_state.h" |
| 12 #include "vm/isolate.h" | 13 #include "vm/isolate.h" |
| 13 #include "vm/object.h" | 14 #include "vm/object.h" |
| 14 #include "vm/stack_frame.h" | 15 #include "vm/stack_frame.h" |
| 15 #include "vm/store_buffer.h" | 16 #include "vm/store_buffer.h" |
| 16 #include "vm/verifier.h" | 17 #include "vm/verifier.h" |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 // Key is white. Delay the weak property. | 505 // Key is white. Delay the weak property. |
| 505 visitor->DelayWeakProperty(raw_weak); | 506 visitor->DelayWeakProperty(raw_weak); |
| 506 return raw_weak->Size(); | 507 return raw_weak->Size(); |
| 507 } else { | 508 } else { |
| 508 // Key is gray or black. Make the weak property black. | 509 // Key is gray or black. Make the weak property black. |
| 509 return raw_weak->VisitPointers(visitor); | 510 return raw_weak->VisitPointers(visitor); |
| 510 } | 511 } |
| 511 } | 512 } |
| 512 | 513 |
| 513 | 514 |
| 515 void Scavenger::ProcessPeerReferents() { |
| 516 PeerTable prev; |
| 517 std::swap(prev, peer_table_); |
| 518 for (PeerTable::iterator it = prev.begin(); it != prev.end(); ++it) { |
| 519 RawObject* raw_obj = it->first; |
| 520 ASSERT(raw_obj->IsHeapObject()); |
| 521 uword raw_addr = RawObject::ToAddr(raw_obj); |
| 522 uword header = *reinterpret_cast<uword*>(raw_addr); |
| 523 if (IsForwarding(header)) { |
| 524 // The object has survived. Preserve its record. |
| 525 uword new_addr = ForwardedAddr(header); |
| 526 raw_obj = RawObject::FromAddr(new_addr); |
| 527 heap_->SetPeer(raw_obj, it->second); |
| 528 } |
| 529 } |
| 530 } |
| 531 |
| 532 |
| 514 void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const { | 533 void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const { |
| 515 uword cur = FirstObjectStart(); | 534 uword cur = FirstObjectStart(); |
| 516 while (cur < top_) { | 535 while (cur < top_) { |
| 517 RawObject* raw_obj = RawObject::FromAddr(cur); | 536 RawObject* raw_obj = RawObject::FromAddr(cur); |
| 518 cur += raw_obj->VisitPointers(visitor); | 537 cur += raw_obj->VisitPointers(visitor); |
| 519 } | 538 } |
| 520 } | 539 } |
| 521 | 540 |
| 522 | 541 |
| 523 void Scavenger::VisitObjects(ObjectVisitor* visitor) const { | 542 void Scavenger::VisitObjects(ObjectVisitor* visitor) const { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 timer.Start(); | 577 timer.Start(); |
| 559 // Setup the visitor and run a scavenge. | 578 // Setup the visitor and run a scavenge. |
| 560 ScavengerVisitor visitor(isolate, this); | 579 ScavengerVisitor visitor(isolate, this); |
| 561 Prologue(isolate, invoke_api_callbacks); | 580 Prologue(isolate, invoke_api_callbacks); |
| 562 IterateRoots(isolate, &visitor, !invoke_api_callbacks); | 581 IterateRoots(isolate, &visitor, !invoke_api_callbacks); |
| 563 ProcessToSpace(&visitor); | 582 ProcessToSpace(&visitor); |
| 564 IterateWeakReferences(isolate, &visitor); | 583 IterateWeakReferences(isolate, &visitor); |
| 565 ScavengerWeakVisitor weak_visitor(this); | 584 ScavengerWeakVisitor weak_visitor(this); |
| 566 IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks); | 585 IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks); |
| 567 visitor.Finalize(); | 586 visitor.Finalize(); |
| 587 ProcessPeerReferents(); |
| 568 Epilogue(isolate, invoke_api_callbacks); | 588 Epilogue(isolate, invoke_api_callbacks); |
| 569 timer.Stop(); | 589 timer.Stop(); |
| 570 if (FLAG_verbose_gc) { | 590 if (FLAG_verbose_gc) { |
| 571 OS::PrintErr("Scavenge[%d]: %"Pd64"us\n", | 591 OS::PrintErr("Scavenge[%d]: %"Pd64"us\n", |
| 572 count_, | 592 count_, |
| 573 timer.TotalElapsedTime()); | 593 timer.TotalElapsedTime()); |
| 574 } | 594 } |
| 575 | 595 |
| 576 if (FLAG_verify_after_gc) { | 596 if (FLAG_verify_after_gc) { |
| 577 OS::PrintErr("Verifying after Scavenge..."); | 597 OS::PrintErr("Verifying after Scavenge..."); |
| 578 heap_->Verify(); | 598 heap_->Verify(); |
| 579 OS::PrintErr(" done.\n"); | 599 OS::PrintErr(" done.\n"); |
| 580 } | 600 } |
| 581 | 601 |
| 582 count_++; | 602 count_++; |
| 583 // Done scavenging. Reset the marker. | 603 // Done scavenging. Reset the marker. |
| 584 ASSERT(scavenging_); | 604 ASSERT(scavenging_); |
| 585 scavenging_ = false; | 605 scavenging_ = false; |
| 586 } | 606 } |
| 587 | 607 |
| 588 | 608 |
| 589 void Scavenger::WriteProtect(bool read_only) { | 609 void Scavenger::WriteProtect(bool read_only) { |
| 590 space_->Protect( | 610 space_->Protect( |
| 591 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite); | 611 read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite); |
| 592 } | 612 } |
| 593 | 613 |
| 614 |
| 615 void Scavenger::SetPeer(RawObject* raw_obj, void* peer) { |
| 616 if (peer == NULL) { |
| 617 peer_table_.erase(raw_obj); |
| 618 } else { |
| 619 peer_table_[raw_obj] = peer; |
| 620 } |
| 621 } |
| 622 |
| 623 |
| 624 void* Scavenger::GetPeer(RawObject* raw_obj) { |
| 625 PeerTable::iterator it = peer_table_.find(raw_obj); |
| 626 return (it == peer_table_.end()) ? NULL : it->second; |
| 627 } |
| 628 |
| 629 |
| 630 int64_t Scavenger::PeerCount() const { |
| 631 return static_cast<int64_t>(peer_table_.size()); |
| 632 } |
| 633 |
| 594 } // namespace dart | 634 } // namespace dart |
| OLD | NEW |