Chromium Code Reviews| Index: src/heap/heap.cc |
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
| index 713cda82f57b786da7ac63195b81969cd715cbc9..9ffeac4d3822cbbbefd1d94262c4e1a85a81ceb0 100644 |
| --- a/src/heap/heap.cc |
| +++ b/src/heap/heap.cc |
| @@ -27,6 +27,7 @@ |
| #include "src/heap/object-stats.h" |
| #include "src/heap/objects-visiting-inl.h" |
| #include "src/heap/objects-visiting.h" |
| +#include "src/heap/remembered-set.h" |
| #include "src/heap/scavenge-job.h" |
| #include "src/heap/scavenger-inl.h" |
| #include "src/heap/store-buffer.h" |
| @@ -462,6 +463,7 @@ void Heap::GarbageCollectionPrologue() { |
| } |
| CheckNewSpaceExpansionCriteria(); |
| UpdateNewSpaceAllocationCounter(); |
| + store_buffer()->MoveEntriesToRememberedSet(); |
| } |
| @@ -1678,7 +1680,8 @@ void Heap::Scavenge() { |
| // Copy objects reachable from the old generation. |
| GCTracer::Scope gc_scope(tracer(), |
| GCTracer::Scope::SCAVENGER_OLD_TO_NEW_POINTERS); |
| - store_buffer()->IteratePointersToNewSpace(&Scavenger::ScavengeObject); |
| + RememberedSet<OLD_TO_NEW>::IterateWithWrapper(this, |
| + Scavenger::ScavengeObject); |
| } |
| { |
| @@ -4433,8 +4436,6 @@ void Heap::Verify() { |
| CHECK(HasBeenSetUp()); |
| HandleScope scope(isolate()); |
| - store_buffer()->Verify(); |
| - |
| if (mark_compact_collector()->sweeping_in_progress()) { |
| // We have to wait here for the sweeper threads to have an iterable heap. |
| mark_compact_collector()->EnsureSweepingCompleted(); |
| @@ -4482,6 +4483,7 @@ void Heap::IterateAndMarkPointersToFromSpace(HeapObject* object, Address start, |
| Address end, bool record_slots, |
| ObjectSlotCallback callback) { |
| Address slot_address = start; |
| + Page* page = Page::FromAddress(start); |
| while (slot_address < end) { |
| Object** slot = reinterpret_cast<Object**>(slot_address); |
| @@ -4498,7 +4500,7 @@ void Heap::IterateAndMarkPointersToFromSpace(HeapObject* object, Address start, |
| if (InNewSpace(new_target)) { |
| SLOW_DCHECK(Heap::InToSpace(new_target)); |
| SLOW_DCHECK(new_target->IsHeapObject()); |
| - store_buffer_.Mark(reinterpret_cast<Address>(slot)); |
| + RememberedSet<OLD_TO_NEW>::Insert(page, slot_address); |
| } |
| SLOW_DCHECK(!MarkCompactCollector::IsOnEvacuationCandidate(new_target)); |
| } else if (record_slots && |
| @@ -5478,7 +5480,11 @@ void Heap::CheckHandleCount() { |
| void Heap::ClearRecordedSlot(HeapObject* object, Object** slot) { |
| if (!InNewSpace(object)) { |
| - store_buffer()->Remove(reinterpret_cast<Address>(slot)); |
| + store_buffer()->MoveEntriesToRememberedSet(); |
| + Address slot_addr = reinterpret_cast<Address>(slot); |
| + Page* page = Page::FromAddress(slot_addr); |
|
Hannes Payer (out of office)
2016/02/15 16:53:38
Why don't we move
Page* page = Page::FromAddress(
ulan
2016/02/16 10:24:52
I made the page a parameter because of slots buffe
Hannes Payer (out of office)
2016/02/16 12:00:53
Acknowledged.
|
| + DCHECK_EQ(page->owner()->identity(), OLD_SPACE); |
| + RememberedSet<OLD_TO_NEW>::Remove(page, slot_addr); |
| } |
| } |