| // 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 <map> |
| |
| #include "base/base_export.h" |
| #include "base/macros.h" |
| #include "base/strings/string_piece.h" |
| #include "base/trace_event/trace_event_impl.h" |
| #include "starboard/types.h" |
| |
| namespace base { |
| |
| template <typename Type> |
| 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* const* arg_names, |
| const unsigned char* arg_types, |
| const unsigned long long* arg_values, |
| const std::unique_ptr<ConvertableToTraceFormat>* 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(StringPiece category_group_name); |
| |
| private: |
| // Ensure only the provider can construct us. |
| friend struct StaticMemorySingletonTraits<TraceEventETWExport>; |
| // 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(StringPiece 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<StringPiece, bool> 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. |
| std::unique_ptr<ETWKeywordUpdateThread> 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_ |