| 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.
|
|
|