// Copyright 2015 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 exporting to ETW. #ifndef BASE_TRACE_EVENT_TRACE_EVENT_ETW_EXPORT_WIN_H_ #define BASE_TRACE_EVENT_TRACE_EVENT_ETW_EXPORT_WIN_H_ #include #include #include #include #include "base/base_export.h" #include "base/strings/string_piece.h" #include "base/trace_event/trace_event_impl.h" #include "base/trace_event/trace_logging_minimal_win.h" namespace base { template struct StaticMemorySingletonTraits; namespace trace_event { class BASE_EXPORT TraceEventETWExport { public: TraceEventETWExport(const TraceEventETWExport&) = delete; TraceEventETWExport& operator=(const TraceEventETWExport&) = delete; ~TraceEventETWExport(); // Retrieves the singleton. // Note that this may return NULL post-AtExit processing. static TraceEventETWExport* GetInstance(); // Retrieves the singleton iff it was previously instantiated by a // GetInstance() call. Avoids creating the instance only to check that it // wasn't disabled. Note that, like GetInstance(), this may also return NULL // post-AtExit processing. static TraceEventETWExport* GetInstanceIfExists(); // Enables exporting of events to ETW. If tracing is disabled for the Chrome // provider, AddEvent and AddCustomEvent will simply return when called. static void EnableETWExport(); // Exports an event to ETW. This is mainly used in // TraceLog::AddTraceEventWithThreadIdAndTimestamp to export internal events. static void AddEvent(char phase, const unsigned char* category_group_enabled, const char* name, unsigned long long id, const TraceArguments* args); // Exports an ETW event that marks the end of a complete event. static void AddCompleteEndEvent(const unsigned char* category_group_enabled, const char* name); // Returns true if any category in the group is enabled. static bool IsCategoryGroupEnabled(StringPiece category_group_name); // Called from the ETW EnableCallback when the state of the provider or // keywords has changed. static void OnETWEnableUpdate(); private: // Ensure only the provider can construct us. friend struct StaticMemorySingletonTraits; TraceEventETWExport(); // Updates the list of enabled categories by consulting the ETW keyword. // Returns true if there was a change, false otherwise. bool UpdateEnabledCategories(); static uint64_t CategoryGroupToKeyword(const uint8_t* category_state); // Returns true if the category is enabled. bool IsCategoryEnabled(StringPiece category_name) const; static bool is_registration_complete_; // The keywords that were enabled last time the callback was made. uint64_t etw_match_any_keyword_ = 0; // The provider is set based on channel for MSEdge, in other Chromium // based browsers all channels use the same GUID/provider. std::unique_ptr etw_provider_; // Maps category names to their status (enabled/disabled). std::map categories_status_; // Maps category names to their keyword. std::map categories_keyword_; }; } // namespace trace_event } // namespace base #endif // BASE_TRACE_EVENT_TRACE_EVENT_ETW_EXPORT_WIN_H_