168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#ifndef TOOLS_GN_TRACE_H_ 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define TOOLS_GN_TRACE_H_ 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <string> 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/basictypes.h" 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/command_line.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/files/file_path.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/threading/platform_thread.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/time/time.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class Label; 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class TraceItem { 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) enum Type { 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TRACE_SETUP, 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TRACE_FILE_LOAD, 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TRACE_FILE_PARSE, 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TRACE_FILE_EXECUTE, 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TRACE_FILE_WRITE, 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_SCRIPT_EXECUTE, 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TRACE_DEFINE_TARGET, 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TRACE_CHECK_HEADER, // One file. 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TRACE_CHECK_HEADERS, // All files. 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) }; 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TraceItem(Type type, 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& name, 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::PlatformThreadId thread_id); 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ~TraceItem(); 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Type type() const { return type_; } 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& name() const { return name_; } 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::PlatformThreadId thread_id() const { return thread_id_; } 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks begin() const { return begin_; } 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void set_begin(base::TimeTicks b) { begin_ = b; } 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks end() const { return end_; } 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void set_end(base::TimeTicks e) { end_ = e; } 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta delta() const { return end_ - begin_; } 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Optional toolchain label. 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& toolchain() const { return toolchain_; } 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void set_toolchain(const std::string& t) { toolchain_ = t; } 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Optional command line. 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& cmdline() const { return cmdline_; } 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void set_cmdline(const std::string& c) { cmdline_ = c; } 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Type type_; 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string name_; 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::PlatformThreadId thread_id_; 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks begin_; 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeTicks end_; 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string toolchain_; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string cmdline_; 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class ScopedTrace { 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ScopedTrace(TraceItem::Type t, const std::string& name); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ScopedTrace(TraceItem::Type t, const Label& label); 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ~ScopedTrace(); 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void SetToolchain(const Label& label); 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void SetCommandLine(const base::CommandLine& cmdline); 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void Done(); 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) TraceItem* item_; 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool done_; 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Call to turn tracing on. It's off by default. 8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EnableTracing(); 8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Adds a trace event to the log. Takes ownership of the pointer. 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AddTrace(TraceItem* item); 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Returns a summary of the current traces, or the empty string if tracing is 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// not enabled. 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string SummarizeTraces(); 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Saves the current traces to the given filename in JSON format. 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void SaveTraces(const base::FilePath& file_name); 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // TOOLS_GN_TRACE_H_ 99