| // 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_ |