// 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 "base/base_export.h" #include "base/macros.h" #include "base/strings/string_piece.h" #include "base/trace_event/trace_event_impl.h" namespace base { template struct StaticMemorySingletonTraits; namespace trace_event { class BASE_EXPORT TraceEventETWExport { public: ~TraceEventETWExport(); // Retrieves the singleton. // Note that this may return NULL post-AtExit processing. static TraceEventETWExport* GetInstance(); // Enables/disables exporting of events to ETW. If disabled, // AddEvent and AddCustomEvent will simply return when called. static void EnableETWExport(); static void DisableETWExport(); // Returns true if ETW is enabled. For now, this is true if the command line // flag is specified. static bool IsETWExportEnabled(); // 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, int num_args, const char** arg_names, const unsigned char* arg_types, const unsigned long long* arg_values, const scoped_refptr* convertable_values); // Exports an ETW event that marks the end of a complete event. static void AddCompleteEndEvent(const char* name); // Returns true if any category in the group is enabled. static bool IsCategoryGroupEnabled(const char* category_group_name); private: // Ensure only the provider can construct us. friend struct StaticMemorySingletonTraits; // To have access to UpdateKeyword(). class ETWKeywordUpdateThread; TraceEventETWExport(); // Updates the list of enabled categories by consulting the ETW keyword. // Returns true if there was a change, false otherwise. bool UpdateEnabledCategories(); // Returns true if the category is enabled. bool IsCategoryEnabled(const char* category_name) const; // Called back by the update thread to check for potential changes to the // keyword. static void UpdateETWKeyword(); // True if ETW is enabled. Allows hiding the exporting behind a flag. bool etw_export_enabled_; // Maps category names to their status (enabled/disabled). std::map categories_status_; // Local copy of the ETW keyword. uint64_t etw_match_any_keyword_; // Background thread that monitors changes to the ETW keyword and updates // the enabled categories when a change occurs. scoped_ptr keyword_update_thread_; PlatformThreadHandle keyword_update_thread_handle_; DISALLOW_COPY_AND_ASSIGN(TraceEventETWExport); }; } // namespace trace_event } // namespace base #endif // BASE_TRACE_EVENT_TRACE_EVENT_ETW_EXPORT_WIN_H_