| Index: runtime/vm/scavenger.cc
|
| diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
|
| index 2309e6ca2aa3bb5c5b08cdf062cc4556206060b5..10b07c8ed9cf76c149a8b43fdff1c37e473e804e 100644
|
| --- a/runtime/vm/scavenger.cc
|
| +++ b/runtime/vm/scavenger.cc
|
| @@ -337,7 +337,8 @@ Scavenger::Scavenger(Heap* heap,
|
| delayed_weak_properties_(NULL),
|
| gc_time_micros_(0),
|
| collections_(0),
|
| - external_size_(0) {
|
| + external_size_(0),
|
| + space_lock_(new Mutex()) {
|
| // Verify assumptions about the first word in objects which the scavenger is
|
| // going to use for forwarding pointers.
|
| ASSERT(Object::tags_offset() == 0);
|
| @@ -365,6 +366,7 @@ Scavenger::Scavenger(Heap* heap,
|
| Scavenger::~Scavenger() {
|
| ASSERT(!scavenging_);
|
| to_->Delete();
|
| + delete space_lock_;
|
| }
|
|
|
|
|
| @@ -387,6 +389,9 @@ SemiSpace* Scavenger::Prologue(Isolate* isolate, bool invoke_api_callbacks) {
|
| (isolate->gc_prologue_callback())();
|
| }
|
| isolate->PrepareForGC();
|
| +
|
| + ASSERT(isolate->mutator_thread()->top() == top_);
|
| +
|
| // Flip the two semi-spaces so that to_ is always the space for allocating
|
| // objects.
|
| SemiSpace* from = to_;
|
| @@ -400,6 +405,10 @@ SemiSpace* Scavenger::Prologue(Isolate* isolate, bool invoke_api_callbacks) {
|
| top_ = FirstObjectStart();
|
| resolved_top_ = top_;
|
| end_ = to_->end();
|
| +
|
| + isolate->mutator_thread()->set_top_offset(top_);
|
| + isolate->mutator_thread()->set_end_offset(end_);
|
| +
|
| return from;
|
| }
|
|
|
| @@ -409,6 +418,10 @@ void Scavenger::Epilogue(Isolate* isolate,
|
| bool invoke_api_callbacks) {
|
| // All objects in the to space have been copied from the from space at this
|
| // moment.
|
| +
|
| + isolate->mutator_thread()->set_top_offset(top_);
|
| + isolate->mutator_thread()->set_end_offset(end_);
|
| +
|
| double avg_frac = stats_history_.Get(0).PromoCandidatesSuccessFraction();
|
| if (stats_history_.Size() >= 2) {
|
| // Previous scavenge is only given half as much weight.
|
| @@ -545,6 +558,9 @@ void Scavenger::IterateWeakRoots(Isolate* isolate, HandleVisitor* visitor) {
|
|
|
| void Scavenger::ProcessToSpace(ScavengerVisitor* visitor) {
|
| // Iterate until all work has been drained.
|
| +
|
| + ASSERT(Isolate::Current()->mutator_thread()->top() == top_);
|
| +
|
| while ((resolved_top_ < top_) || PromotedStackHasMore()) {
|
| while (resolved_top_ < top_) {
|
| RawObject* raw_obj = RawObject::FromAddr(resolved_top_);
|
|
|