| Index: src/heap/gc-tracer.cc
|
| diff --git a/src/heap/gc-tracer.cc b/src/heap/gc-tracer.cc
|
| index 815baa440c308bf4fd619929e74a09db7fa11cf3..3239015a84469677c0beea4f7a719cf8d0f02ee6 100644
|
| --- a/src/heap/gc-tracer.cc
|
| +++ b/src/heap/gc-tracer.cc
|
| @@ -164,11 +164,9 @@ void GCTracer::Start(GarbageCollector collector, const char* gc_reason,
|
| void GCTracer::Stop(GarbageCollector collector) {
|
| start_counter_--;
|
| if (start_counter_ != 0) {
|
| - if (FLAG_trace_gc) {
|
| - PrintF("[Finished reentrant %s during %s.]\n",
|
| - collector == SCAVENGER ? "Scavenge" : "Mark-sweep",
|
| - current_.TypeName(false));
|
| - }
|
| + Output("[Finished reentrant %s during %s.]\n",
|
| + collector == SCAVENGER ? "Scavenge" : "Mark-sweep",
|
| + current_.TypeName(false));
|
| return;
|
| }
|
|
|
| @@ -235,8 +233,6 @@ void GCTracer::Stop(GarbageCollector collector) {
|
|
|
| // TODO(ernstm): move the code below out of GCTracer.
|
|
|
| - if (!FLAG_trace_gc && !FLAG_print_cumulative_gc_stat) return;
|
| -
|
| double duration = current_.end_time - current_.start_time;
|
| double spent_in_mutator = Max(current_.start_time - previous_.end_time, 0.0);
|
|
|
| @@ -246,12 +242,12 @@ void GCTracer::Stop(GarbageCollector collector) {
|
| if (current_.type == Event::SCAVENGER && FLAG_trace_gc_ignore_scavenger)
|
| return;
|
|
|
| - if (FLAG_trace_gc) {
|
| - if (FLAG_trace_gc_nvp)
|
| - PrintNVP();
|
| - else
|
| - Print();
|
| + if (FLAG_trace_gc_nvp)
|
| + PrintNVP();
|
| + else
|
| + Print();
|
|
|
| + if (FLAG_trace_gc) {
|
| heap_->PrintShortHeapStatistics();
|
| }
|
| }
|
| @@ -314,11 +310,33 @@ void GCTracer::AddIncrementalMarkingStep(double duration, intptr_t bytes) {
|
| }
|
|
|
|
|
| +void GCTracer::Output(const char* format, ...) const {
|
| + if (FLAG_trace_gc) {
|
| + va_list arguments;
|
| + va_start(arguments, format);
|
| + base::OS::VPrint(format, arguments);
|
| + va_end(arguments);
|
| + }
|
| +
|
| + const int kBufferSize = 256;
|
| + char raw_buffer[kBufferSize];
|
| + Vector<char> buffer(raw_buffer, kBufferSize);
|
| + va_list arguments2;
|
| + va_start(arguments2, format);
|
| + VSNPrintF(buffer, format, arguments2);
|
| + va_end(arguments2);
|
| +
|
| + heap_->AddToRingBuffer(buffer.start());
|
| +}
|
| +
|
| +
|
| void GCTracer::Print() const {
|
| - PrintIsolate(heap_->isolate(), "%8.0f ms: ",
|
| - heap_->isolate()->time_millis_since_init());
|
| + if (FLAG_trace_gc) {
|
| + PrintIsolate(heap_->isolate(), "");
|
| + }
|
| + Output("%8.0f ms: ", heap_->isolate()->time_millis_since_init());
|
|
|
| - PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ", current_.TypeName(false),
|
| + Output("%s %.1f (%.1f) -> %.1f (%.1f) MB, ", current_.TypeName(false),
|
| static_cast<double>(current_.start_object_size) / MB,
|
| static_cast<double>(current_.start_memory_size) / MB,
|
| static_cast<double>(current_.end_object_size) / MB,
|
| @@ -328,16 +346,16 @@ void GCTracer::Print() const {
|
| if (external_time > 0) PrintF("%d / ", external_time);
|
|
|
| double duration = current_.end_time - current_.start_time;
|
| - PrintF("%.1f ms", duration);
|
| + Output("%.1f ms", duration);
|
| if (current_.type == Event::SCAVENGER) {
|
| if (current_.incremental_marking_steps > 0) {
|
| - PrintF(" (+ %.1f ms in %d steps since last GC)",
|
| + Output(" (+ %.1f ms in %d steps since last GC)",
|
| current_.incremental_marking_duration,
|
| current_.incremental_marking_steps);
|
| }
|
| } else {
|
| if (current_.incremental_marking_steps > 0) {
|
| - PrintF(
|
| + Output(
|
| " (+ %.1f ms in %d steps since start of marking, "
|
| "biggest step %.1f ms)",
|
| current_.incremental_marking_duration,
|
| @@ -347,14 +365,14 @@ void GCTracer::Print() const {
|
| }
|
|
|
| if (current_.gc_reason != NULL) {
|
| - PrintF(" [%s]", current_.gc_reason);
|
| + Output(" [%s]", current_.gc_reason);
|
| }
|
|
|
| if (current_.collector_reason != NULL) {
|
| - PrintF(" [%s]", current_.collector_reason);
|
| + Output(" [%s]", current_.collector_reason);
|
| }
|
|
|
| - PrintF(".\n");
|
| + Output(".\n");
|
| }
|
|
|
|
|
|
|