1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file contains the Windows-specific declarations for trace_event.h. 6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#ifndef BASE_DEBUG_TRACE_EVENT_WIN_H_ 7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define BASE_DEBUG_TRACE_EVENT_WIN_H_ 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/base_api.h" 13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/win/event_trace_provider.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define TRACE_EVENT_BEGIN(name, id, extra) \ 16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::debug::TraceLog::Trace( \ 17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch name, \ 18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::debug::TraceLog::EVENT_BEGIN, \ 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reinterpret_cast<const void*>(id), \ 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch extra); 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define TRACE_EVENT_END(name, id, extra) \ 23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::debug::TraceLog::Trace( \ 24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch name, \ 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::debug::TraceLog::EVENT_END, \ 26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reinterpret_cast<const void*>(id), \ 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch extra); 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define TRACE_EVENT_INSTANT(name, id, extra) \ 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::debug::TraceLog::Trace( \ 31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch name, \ 32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch base::debug::TraceLog::EVENT_INSTANT, \ 33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch reinterpret_cast<const void*>(id), \ 34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch extra); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Fwd. 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Type> 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct StaticMemorySingletonTraits; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace base { 41513209b27ff55e2841eac0e4120199c23acce758Ben Murdochnamespace debug { 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This EtwTraceProvider subclass implements ETW logging 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// for the macros above on Windows. 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BASE_API TraceLog : public base::win::EtwTraceProvider { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum EventType { 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EVENT_BEGIN, 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EVENT_END, 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EVENT_INSTANT 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start logging trace events. 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is a noop in this implementation. 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool StartTracing(); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Trace begin/end/instant events, this is the bottleneck implementation 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // all the others defer to. 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Allowing the use of std::string for name or extra is a convenience, 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // whereas passing name or extra as a const char* avoids the construction 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of temporary std::string instances. 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If -1 is passed for name_len or extra_len, the strlen of the string will 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be used for length. 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void Trace(const char* name, 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t name_len, 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EventType type, 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const void* id, 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* extra, 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t extra_len); 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Allows passing extra as a std::string for convenience. 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void Trace(const char* name, 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EventType type, 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const void* id, 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& extra) { 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return Trace(name, -1, type, id, extra.c_str(), extra.length()); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Allows passing extra as a const char* to avoid constructing temporary 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // std::string instances where not needed. 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void Trace(const char* name, 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EventType type, 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const void* id, 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* extra) { 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return Trace(name, -1, type, id, extra, -1); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Retrieves the singleton. 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note that this may return NULL post-AtExit processing. 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static TraceLog* GetInstance(); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true iff tracing is turned on. 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool IsTracing() { 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return enable_level() >= TRACE_LEVEL_INFORMATION; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Emit a trace of type |type| containing |name|, |id|, and |extra|. 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note: |name| and |extra| must be NULL, or a zero-terminated string of 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // length |name_len| or |extra_len| respectively. 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note: if name_len or extra_len are -1, the length of the corresponding 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // string will be used. 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void TraceEvent(const char* name, 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t name_len, 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EventType type, 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const void* id, 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* extra, 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t extra_len); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Exposed for unittesting only, allows resurrecting our 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // singleton instance post-AtExit processing. 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void Resurrect(); 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ensure only the provider can construct us. 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend struct StaticMemorySingletonTraits<TraceLog>; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TraceLog(); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(TraceLog); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The ETW trace provider GUID. 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBASE_API extern const GUID kChromeTraceProviderName; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The ETW event class GUID for 32 bit events. 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBASE_API extern const GUID kTraceEventClass32; 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The ETW event class GUID for 64 bit events. 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBASE_API extern const GUID kTraceEventClass64; 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The ETW event types, IDs 0x00-0x09 are reserved, so start at 0x10. 131513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst base::win::EtwEventType kTraceEventTypeBegin = 0x10; 132513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst base::win::EtwEventType kTraceEventTypeEnd = 0x11; 133513209b27ff55e2841eac0e4120199c23acce758Ben Murdochconst base::win::EtwEventType kTraceEventTypeInstant = 0x12; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// If this flag is set in enable flags 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochenum TraceEventFlags { 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CAPTURE_STACK_TRACE = 0x0001, 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The event format consists of: 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The "name" string as a zero-terminated ASCII string. 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The id pointer in the machine bitness. 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The "extra" string as a zero-terminated ASCII string. 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Optionally the stack trace, consisting of a DWORD "depth", followed 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// by an array of void* (machine bitness) of length "depth". 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Forward decl. 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct TraceLogSingletonTraits; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} // nemspace debug 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace base 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif // BASE_DEBUG_TRACE_EVENT_WIN_H_ 154