diff --git a/mold.h b/mold.h index 73fe6910d2..1dd7031988 100644 --- a/mold.h +++ b/mold.h @@ -543,12 +543,12 @@ struct TimerRecord { std::string name; TimerRecord *parent; + std::once_flag once; tbb::concurrent_vector children; i64 start; i64 end; i64 user; i64 sys; - bool stopped = false; }; void diff --git a/perf.cc b/perf.cc index 51e95168d3..2c60b90f53 100644 --- a/perf.cc +++ b/perf.cc @@ -46,16 +46,14 @@ TimerRecord::TimerRecord(std::string name, TimerRecord *parent) } void TimerRecord::stop() { - if (stopped) - return; - stopped = true; + std::call_once(once, [&]() { + struct rusage usage; + getrusage(RUSAGE_SELF, &usage); - struct rusage usage; - getrusage(RUSAGE_SELF, &usage); - - end = now_nsec(); - user = to_nsec(usage.ru_utime) - user; - sys = to_nsec(usage.ru_stime) - sys; + end = now_nsec(); + user = to_nsec(usage.ru_utime) - user; + sys = to_nsec(usage.ru_stime) - sys; + }); } static void print_rec(TimerRecord &rec, i64 indent) {