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