15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains the Windows-specific declarations for trace_event.h.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_DEBUG_TRACE_EVENT_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_DEBUG_TRACE_EVENT_WIN_H_
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/event_trace_provider.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fwd.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Type>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct StaticMemorySingletonTraits;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace debug {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This EtwTraceProvider subclass implements ETW logging
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for the macros above on Windows.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT TraceEventETWProvider : public base::win::EtwTraceProvider {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start logging trace events.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a noop in this implementation.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool StartTracing();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trace begin/end/instant events, this is the bottleneck implementation
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // all the others defer to.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allowing the use of std::string for name or extra is a convenience,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // whereas passing name or extra as a const char* avoids the construction
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of temporary std::string instances.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If -1 is passed for name_len or extra_len, the strlen of the string will
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be used for length.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Trace(const char* name,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    size_t name_len,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    char type,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const void* id,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const char* extra,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    size_t extra_len);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows passing extra as a std::string for convenience.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Trace(const char* name,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    char type,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const void* id,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const std::string& extra) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Trace(name, -1, type, id, extra.c_str(), extra.length());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows passing extra as a const char* to avoid constructing temporary
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // std::string instances where not needed.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Trace(const char* name,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    char type,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const void* id,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const char* extra) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Trace(name, -1, type, id, extra, -1);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves the singleton.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that this may return NULL post-AtExit processing.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TraceEventETWProvider* GetInstance();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true iff tracing is turned on.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTracing() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enable_level() >= TRACE_LEVEL_INFORMATION;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emit a trace of type |type| containing |name|, |id|, and |extra|.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: |name| and |extra| must be NULL, or a zero-terminated string of
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    length |name_len| or |extra_len| respectively.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: if name_len or extra_len are -1, the length of the corresponding
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    string will be used.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TraceEvent(const char* name,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  size_t name_len,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  char type,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const void* id,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const char* extra,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  size_t extra_len);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exposed for unittesting only, allows resurrecting our
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // singleton instance post-AtExit processing.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Resurrect();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure only the provider can construct us.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct StaticMemorySingletonTraits<TraceEventETWProvider>;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TraceEventETWProvider();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TraceEventETWProvider);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ETW trace provider GUID.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT extern const GUID kChromeTraceProviderName;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ETW event class GUID for 32 bit events.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT extern const GUID kTraceEventClass32;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ETW event class GUID for 64 bit events.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT extern const GUID kTraceEventClass64;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ETW event types, IDs 0x00-0x09 are reserved, so start at 0x10.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::win::EtwEventType kTraceEventTypeBegin = 0x10;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::win::EtwEventType kTraceEventTypeEnd = 0x11;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::win::EtwEventType kTraceEventTypeInstant = 0x12;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If this flag is set in enable flags
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum TraceEventETWFlags {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CAPTURE_STACK_TRACE = 0x0001,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The event format consists of:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The "name" string as a zero-terminated ASCII string.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The id pointer in the machine bitness.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The "extra" string as a zero-terminated ASCII string.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Optionally the stack trace, consisting of a DWORD "depth", followed
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    by an array of void* (machine bitness) of length "depth".
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace debug
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_DEBUG_TRACE_EVENT_WIN_H_
124