| Index: runtime/vm/scavenger.cc
|
| diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
|
| index 8953e7c941d017de6e0169dae2a4f5b00bc5fe5d..7daa940d01dd50b2466ecc36db3bb503eeda1472 100644
|
| --- a/runtime/vm/scavenger.cc
|
| +++ b/runtime/vm/scavenger.cc
|
| @@ -172,6 +172,9 @@ class ScavengerVisitor : public ObjectPointerVisitor {
|
| // Not a survivor of a previous scavenge. Just copy the object into the
|
| // to space.
|
| new_addr = scavenger_->TryAllocate(size);
|
| + if (HeapTrace::is_enabled()) {
|
| + heap_->trace()->TraceCopy(raw_addr, new_addr);
|
| + }
|
| } else {
|
| // TODO(iposva): Experiment with less aggressive promotion. For example
|
| // a coin toss determines if an object is promoted or whether it should
|
| @@ -185,6 +188,9 @@ class ScavengerVisitor : public ObjectPointerVisitor {
|
| // be traversed later.
|
| scavenger_->PushToPromotedStack(new_addr);
|
| bytes_promoted_ += size;
|
| + if (HeapTrace::is_enabled()) {
|
| + heap_->trace()->TracePromotion(raw_addr, new_addr);
|
| + }
|
| } else if (!scavenger_->had_promotion_failure_) {
|
| // Signal a promotion failure and set the growth policy for
|
| // this, and all subsequent promotion allocations, to force
|
| @@ -195,15 +201,24 @@ class ScavengerVisitor : public ObjectPointerVisitor {
|
| if (new_addr != 0) {
|
| scavenger_->PushToPromotedStack(new_addr);
|
| bytes_promoted_ += size;
|
| + if (HeapTrace::is_enabled()) {
|
| + heap_->trace()->TracePromotion(raw_addr, new_addr);
|
| + }
|
| } else {
|
| // Promotion did not succeed. Copy into the to space
|
| // instead.
|
| new_addr = scavenger_->TryAllocate(size);
|
| + if (HeapTrace::is_enabled()) {
|
| + heap_->trace()->TraceCopy(raw_addr, new_addr);
|
| + }
|
| }
|
| } else {
|
| ASSERT(growth_policy_ == PageSpace::kForceGrowth);
|
| // Promotion did not succeed. Copy into the to space instead.
|
| new_addr = scavenger_->TryAllocate(size);
|
| + if (HeapTrace::is_enabled()) {
|
| + heap_->trace()->TraceCopy(raw_addr, new_addr);
|
| + }
|
| }
|
| }
|
| // During a scavenge we always succeed to at least copy all of the
|
| @@ -635,6 +650,8 @@ void Scavenger::Scavenge(bool invoke_api_callbacks, const char* gc_reason) {
|
| if (FLAG_verbose_gc) {
|
| OS::PrintErr("Start scavenge for %s collection\n", gc_reason);
|
| }
|
| + uword prev_first_obj_start = FirstObjectStart();
|
| + uword prev_top_addr = *(TopAddress());
|
| Timer timer(FLAG_verbose_gc, "Scavenge");
|
| timer.Start();
|
|
|
| @@ -680,6 +697,10 @@ void Scavenger::Scavenge(bool invoke_api_callbacks, const char* gc_reason) {
|
| OS::PrintErr(" done.\n");
|
| }
|
|
|
| + if (HeapTrace::is_enabled()) {
|
| + heap_->trace()->TraceDeathRange(prev_first_obj_start, prev_top_addr);
|
| + }
|
| +
|
| count_++;
|
| // Done scavenging. Reset the marker.
|
| ASSERT(scavenging_);
|
|
|