}
void EnableTracing() {
- CHECK(!trace_log);
- trace_log = new TraceLog;
+ if (!trace_log)
+ trace_log = new TraceLog;
}
void AddTrace(TraceItem* item) {
std::vector<const TraceItem*> parses;
std::vector<const TraceItem*> file_execs;
std::vector<const TraceItem*> script_execs;
+ std::vector<const TraceItem*> check_headers;
+ int headers_checked = 0;
for (size_t i = 0; i < events.size(); i++) {
switch (events[i]->type()) {
case TraceItem::TRACE_FILE_PARSE:
case TraceItem::TRACE_SCRIPT_EXECUTE:
script_execs.push_back(events[i]);
break;
+ case TraceItem::TRACE_CHECK_HEADERS:
+ check_headers.push_back(events[i]);
+ break;
+ case TraceItem::TRACE_CHECK_HEADER:
+ headers_checked++;
+ break;
+ case TraceItem::TRACE_SETUP:
case TraceItem::TRACE_FILE_LOAD:
case TraceItem::TRACE_FILE_WRITE:
case TraceItem::TRACE_DEFINE_TARGET:
SummarizeScriptExecs(script_execs, out);
out << std::endl;
+ // Generally there will only be one header check, but it's theoretically
+ // possible for more than one to run if more than one build is going in
+ // parallel. Just report the total of all of them.
+ if (!check_headers.empty()) {
+ float check_headers_time = 0;
+ for (size_t i = 0; i < check_headers.size(); i++)
+ check_headers_time += check_headers[i]->delta().InMillisecondsF();
+
+ out << "Header check time: (total time in ms, files checked)\n";
+ out << base::StringPrintf(" %8.2f %d\n",
+ check_headers_time, headers_checked);
+ }
+
return out.str();
}
out << ",\"cat\":";
switch (item.type()) {
+ case TraceItem::TRACE_SETUP:
+ out << "\"setup\"";
+ break;
case TraceItem::TRACE_FILE_LOAD:
out << "\"load\"";
break;
break;
case TraceItem::TRACE_DEFINE_TARGET:
out << "\"define\"";
+ break;
+ case TraceItem::TRACE_CHECK_HEADER:
+ out << "\"hdr\"";
+ break;
+ case TraceItem::TRACE_CHECK_HEADERS:
+ out << "\"header_check\"";
+ break;
}
if (!item.toolchain().empty() || !item.cmdline().empty()) {