|  | // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef TOOLS_GN_TRACE_H_ | 
|  | #define TOOLS_GN_TRACE_H_ | 
|  |  | 
|  | #include <string> | 
|  | #include <thread> | 
|  |  | 
|  | #include "base/macros.h" | 
|  | #include "util/ticks.h" | 
|  |  | 
|  | class Label; | 
|  |  | 
|  | namespace base { | 
|  | class CommandLine; | 
|  | class FilePath; | 
|  | }  // namespace base | 
|  |  | 
|  | class TraceItem { | 
|  | public: | 
|  | enum Type { | 
|  | TRACE_SETUP, | 
|  | TRACE_FILE_LOAD, | 
|  | TRACE_FILE_PARSE, | 
|  | TRACE_FILE_EXECUTE, | 
|  | TRACE_FILE_WRITE, | 
|  | TRACE_IMPORT_LOAD, | 
|  | TRACE_IMPORT_BLOCK, | 
|  | TRACE_SCRIPT_EXECUTE, | 
|  | TRACE_DEFINE_TARGET, | 
|  | TRACE_ON_RESOLVED, | 
|  | TRACE_CHECK_HEADER,   // One file. | 
|  | TRACE_CHECK_HEADERS,  // All files. | 
|  | }; | 
|  |  | 
|  | TraceItem(Type type, const std::string& name, std::thread::id thread_id); | 
|  | ~TraceItem(); | 
|  |  | 
|  | Type type() const { return type_; } | 
|  | const std::string& name() const { return name_; } | 
|  | std::thread::id thread_id() const { return thread_id_; } | 
|  |  | 
|  | Ticks begin() const { return begin_; } | 
|  | void set_begin(Ticks b) { begin_ = b; } | 
|  | Ticks end() const { return end_; } | 
|  | void set_end(Ticks e) { end_ = e; } | 
|  |  | 
|  | TickDelta delta() const { return TicksDelta(end_, begin_); } | 
|  |  | 
|  | // Optional toolchain label. | 
|  | const std::string& toolchain() const { return toolchain_; } | 
|  | void set_toolchain(const std::string& t) { toolchain_ = t; } | 
|  |  | 
|  | // Optional command line. | 
|  | const std::string& cmdline() const { return cmdline_; } | 
|  | void set_cmdline(const std::string& c) { cmdline_ = c; } | 
|  |  | 
|  | private: | 
|  | Type type_; | 
|  | std::string name_; | 
|  | std::thread::id thread_id_; | 
|  |  | 
|  | Ticks begin_; | 
|  | Ticks end_; | 
|  |  | 
|  | std::string toolchain_; | 
|  | std::string cmdline_; | 
|  | }; | 
|  |  | 
|  | class ScopedTrace { | 
|  | public: | 
|  | ScopedTrace(TraceItem::Type t, const std::string& name); | 
|  | ScopedTrace(TraceItem::Type t, const Label& label); | 
|  | ~ScopedTrace(); | 
|  |  | 
|  | void SetToolchain(const Label& label); | 
|  | void SetCommandLine(const base::CommandLine& cmdline); | 
|  |  | 
|  | void Done(); | 
|  |  | 
|  | private: | 
|  | TraceItem* item_; | 
|  | bool done_; | 
|  | }; | 
|  |  | 
|  | // Call to turn tracing on. It's off by default. | 
|  | void EnableTracing(); | 
|  |  | 
|  | // Returns whether tracing is enabled. | 
|  | bool TracingEnabled(); | 
|  |  | 
|  | // Adds a trace event to the log. Takes ownership of the pointer. | 
|  | void AddTrace(TraceItem* item); | 
|  |  | 
|  | // Returns a summary of the current traces, or the empty string if tracing is | 
|  | // not enabled. | 
|  | std::string SummarizeTraces(); | 
|  |  | 
|  | // Saves the current traces to the given filename in JSON format. | 
|  | void SaveTraces(const base::FilePath& file_name); | 
|  |  | 
|  | #endif  // TOOLS_GN_TRACE_H_ |