Index: runtime/vm/scavenger.cc |
=================================================================== |
--- runtime/vm/scavenger.cc (revision 39381) |
+++ runtime/vm/scavenger.cc (working copy) |
@@ -13,12 +13,12 @@ |
#include "vm/isolate.h" |
#include "vm/lockers.h" |
#include "vm/object.h" |
+#include "vm/object_id_ring.h" |
#include "vm/stack_frame.h" |
#include "vm/store_buffer.h" |
#include "vm/verifier.h" |
#include "vm/visitor.h" |
#include "vm/weak_table.h" |
-#include "vm/object_id_ring.h" |
namespace dart { |
@@ -81,6 +81,7 @@ |
scavenger_(scavenger), |
heap_(scavenger->heap_), |
vm_heap_(Dart::vm_isolate()->heap()), |
+ page_space_(scavenger->heap_->old_space()), |
visited_count_(0), |
handled_count_(0), |
delayed_weak_stack_(), |
@@ -204,8 +205,8 @@ |
// |
// This object is a survivor of a previous scavenge. Attempt to promote |
// the object. |
- new_addr = |
- heap_->TryAllocate(size, Heap::kOld, PageSpace::kForceGrowth); |
+ new_addr = page_space_->TryAllocateDataLocked(size, |
+ PageSpace::kForceGrowth); |
if (new_addr != 0) { |
// If promotion succeeded then we need to remember it so that it can |
// be traversed later. |
@@ -240,6 +241,7 @@ |
Scavenger* scavenger_; |
Heap* heap_; |
Heap* vm_heap_; |
+ PageSpace* page_space_; |
intptr_t visited_count_; |
intptr_t handled_count_; |
typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet; |
@@ -781,6 +783,7 @@ |
ASSERT(!scavenging_); |
scavenging_ = true; |
Isolate* isolate = heap_->isolate(); |
+ PageSpace* page_space = heap_->old_space(); |
NoHandleScope no_handles(isolate); |
if (FLAG_verify_before_gc) { |
@@ -796,6 +799,7 @@ |
(survivor_end_ - FirstObjectStart()) / kWordSize; |
Prologue(isolate, invoke_api_callbacks); |
const bool prologue_weak_are_strong = !invoke_api_callbacks; |
+ page_space->AcquireDataLock(); |
IterateRoots(isolate, &visitor, prologue_weak_are_strong); |
int64_t start = OS::GetCurrentTimeMicros(); |
ProcessToSpace(&visitor); |
@@ -807,6 +811,7 @@ |
IterateWeakRoots(isolate, &weak_visitor, visit_prologue_weak_handles); |
visitor.Finalize(); |
ProcessWeakTables(); |
+ page_space->ReleaseDataLock(); |
int64_t end = OS::GetCurrentTimeMicros(); |
heap_->RecordTime(kProcessToSpace, middle - start); |
heap_->RecordTime(kIterateWeaks, end - middle); |