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_); |