Index: runtime/vm/scavenger.cc |
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc |
index d0e6954d329b4704d702b1e58cc56dfff10ed342..f92fe62e2efaa4b828dda6bb2192a581f5e87bf6 100644 |
--- a/runtime/vm/scavenger.cc |
+++ b/runtime/vm/scavenger.cc |
@@ -80,6 +80,7 @@ class ScavengerVisitor : public ObjectPointerVisitor { |
public: |
explicit ScavengerVisitor(Isolate* isolate, Scavenger* scavenger) |
: ObjectPointerVisitor(isolate), |
+ thread_(Thread::Current()), |
scavenger_(scavenger), |
from_start_(scavenger_->from_->start()), |
from_size_(scavenger_->from_->end() - scavenger_->from_->start()), |
@@ -139,7 +140,7 @@ class ScavengerVisitor : public ObjectPointerVisitor { |
return; |
} |
visiting_old_object_->SetRememberedBit(); |
- isolate()->store_buffer()->AddObjectGC(visiting_old_object_); |
+ thread_->StoreBufferAddObjectGC(visiting_old_object_); |
} |
void ScavengePointer(RawObject** p) { |
@@ -239,6 +240,7 @@ class ScavengerVisitor : public ObjectPointerVisitor { |
} |
} |
+ Thread* thread_; |
Scavenger* scavenger_; |
uword from_start_; |
uword from_size_; |
@@ -456,6 +458,7 @@ void Scavenger::Prologue(Isolate* isolate, bool invoke_api_callbacks) { |
if (invoke_api_callbacks && (isolate->gc_prologue_callback() != NULL)) { |
(isolate->gc_prologue_callback())(); |
} |
+ Thread::PrepareForGC(); |
// Flip the two semi-spaces so that to_ is always the space for allocating |
// objects. |
from_ = to_; |
@@ -513,17 +516,16 @@ void Scavenger::Epilogue(Isolate* isolate, |
void Scavenger::IterateStoreBuffers(Isolate* isolate, |
ScavengerVisitor* visitor) { |
- StoreBuffer* buffer = isolate->store_buffer(); |
- heap_->RecordData(kStoreBufferEntries, buffer->Count()); |
- |
// Iterating through the store buffers. |
- // Grab the deduplication sets out of the store buffer. |
+ // Grab the deduplication sets out of the isolate's consolidated store buffer. |
StoreBufferBlock* pending = isolate->store_buffer()->Blocks(); |
+ intptr_t total_count = 0; |
while (pending != NULL) { |
StoreBufferBlock* next = pending->next(); |
// Generated code appends to store buffers; tell MemorySanitizer. |
MSAN_UNPOISON(pending, sizeof(*pending)); |
intptr_t count = pending->Count(); |
+ total_count += count; |
for (intptr_t i = 0; i < count; i++) { |
RawObject* raw_object = pending->At(i); |
ASSERT(raw_object->IsRemembered()); |
@@ -534,6 +536,7 @@ void Scavenger::IterateStoreBuffers(Isolate* isolate, |
delete pending; |
pending = next; |
} |
+ heap_->RecordData(kStoreBufferEntries, total_count); |
heap_->RecordData(kDataUnused1, 0); |
heap_->RecordData(kDataUnused2, 0); |
// Done iterating through old objects remembered in the store buffers. |