// Copyright (c) 2011 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. // This file contains the Windows-specific declarations for trace_event.h. #ifndef BASE_DEBUG_TRACE_EVENT_WIN_H_ #define BASE_DEBUG_TRACE_EVENT_WIN_H_ #pragma once #include <string> #include "base/base_api.h" #include "base/win/event_trace_provider.h" #define TRACE_EVENT_BEGIN(name, id, extra) \ base::debug::TraceLog::Trace( \ name, \ base::debug::TraceLog::EVENT_BEGIN, \ reinterpret_cast<const void*>(id), \ extra); #define TRACE_EVENT_END(name, id, extra) \ base::debug::TraceLog::Trace( \ name, \ base::debug::TraceLog::EVENT_END, \ reinterpret_cast<const void*>(id), \ extra); #define TRACE_EVENT_INSTANT(name, id, extra) \ base::debug::TraceLog::Trace( \ name, \ base::debug::TraceLog::EVENT_INSTANT, \ reinterpret_cast<const void*>(id), \ extra); // Fwd. template <typename Type> struct StaticMemorySingletonTraits; namespace base { namespace debug { // This EtwTraceProvider subclass implements ETW logging // for the macros above on Windows. class BASE_API TraceLog : public base::win::EtwTraceProvider { public: enum EventType { EVENT_BEGIN, EVENT_END, EVENT_INSTANT }; // Start logging trace events. // This is a noop in this implementation. static bool StartTracing(); // Trace begin/end/instant events, this is the bottleneck implementation // all the others defer to. // Allowing the use of std::string for name or extra is a convenience, // whereas passing name or extra as a const char* avoids the construction // of temporary std::string instances. // If -1 is passed for name_len or extra_len, the strlen of the string will // be used for length. static void Trace(const char* name, size_t name_len, EventType type, const void* id, const char* extra, size_t extra_len); // Allows passing extra as a std::string for convenience. static void Trace(const char* name, EventType type, const void* id, const std::string& extra) { return Trace(name, -1, type, id, extra.c_str(), extra.length()); } // Allows passing extra as a const char* to avoid constructing temporary // std::string instances where not needed. static void Trace(const char* name, EventType type, const void* id, const char* extra) { return Trace(name, -1, type, id, extra, -1); } // Retrieves the singleton. // Note that this may return NULL post-AtExit processing. static TraceLog* GetInstance(); // Returns true iff tracing is turned on. bool IsTracing() { return enable_level() >= TRACE_LEVEL_INFORMATION; } // Emit a trace of type |type| containing |name|, |id|, and |extra|. // Note: |name| and |extra| must be NULL, or a zero-terminated string of // length |name_len| or |extra_len| respectively. // Note: if name_len or extra_len are -1, the length of the corresponding // string will be used. void TraceEvent(const char* name, size_t name_len, EventType type, const void* id, const char* extra, size_t extra_len); // Exposed for unittesting only, allows resurrecting our // singleton instance post-AtExit processing. static void Resurrect(); private: // Ensure only the provider can construct us. friend struct StaticMemorySingletonTraits<TraceLog>; TraceLog(); DISALLOW_COPY_AND_ASSIGN(TraceLog); }; // The ETW trace provider GUID. BASE_API extern const GUID kChromeTraceProviderName; // The ETW event class GUID for 32 bit events. BASE_API extern const GUID kTraceEventClass32; // The ETW event class GUID for 64 bit events. BASE_API extern const GUID kTraceEventClass64; // The ETW event types, IDs 0x00-0x09 are reserved, so start at 0x10. const base::win::EtwEventType kTraceEventTypeBegin = 0x10; const base::win::EtwEventType kTraceEventTypeEnd = 0x11; const base::win::EtwEventType kTraceEventTypeInstant = 0x12; // If this flag is set in enable flags enum TraceEventFlags { CAPTURE_STACK_TRACE = 0x0001, }; // The event format consists of: // The "name" string as a zero-terminated ASCII string. // The id pointer in the machine bitness. // The "extra" string as a zero-terminated ASCII string. // Optionally the stack trace, consisting of a DWORD "depth", followed // by an array of void* (machine bitness) of length "depth". // Forward decl. struct TraceLogSingletonTraits; } // nemspace debug } // namespace base #endif // BASE_DEBUG_TRACE_EVENT_WIN_H_