| 1 | // Licensed to the .NET Foundation under one or more agreements. |
| 2 | // The .NET Foundation licenses this file to you under the MIT license. |
| 3 | // See the LICENSE file in the project root for more information. |
| 4 | |
| 5 | #ifndef __EVENTPIPE_PROVIDER_H__ |
| 6 | #define __EVENTPIPE_PROVIDER_H__ |
| 7 | |
| 8 | #ifdef FEATURE_PERFTRACING |
| 9 | |
| 10 | #include "eventpipe.h" |
| 11 | #include "eventpipeconfiguration.h" |
| 12 | #include "slist.h" |
| 13 | |
| 14 | class EventPipeEvent; |
| 15 | |
| 16 | class EventPipeProvider |
| 17 | { |
| 18 | // Declare friends. |
| 19 | friend class EventPipe; |
| 20 | friend class EventPipeConfiguration; |
| 21 | friend class SampleProfiler; |
| 22 | |
| 23 | private: |
| 24 | // The name of the provider. |
| 25 | SString m_providerName; |
| 26 | |
| 27 | // True if the provider is enabled. |
| 28 | bool m_enabled; |
| 29 | |
| 30 | // Bit vector containing the currently enabled keywords. |
| 31 | INT64 m_keywords; |
| 32 | |
| 33 | // The current verbosity of the provider. |
| 34 | EventPipeEventLevel m_providerLevel; |
| 35 | |
| 36 | // List of every event currently associated with the provider. |
| 37 | // New events can be added on-the-fly. |
| 38 | SList<SListElem<EventPipeEvent*>> *m_pEventList; |
| 39 | |
| 40 | // The optional provider callback. |
| 41 | EventPipeCallback m_pCallbackFunction; |
| 42 | |
| 43 | // The optional provider callback data pointer. |
| 44 | void *m_pCallbackData; |
| 45 | |
| 46 | // The configuration object. |
| 47 | EventPipeConfiguration *m_pConfig; |
| 48 | |
| 49 | // True if the provider has been deleted, but that deletion |
| 50 | // has been deferred until tracing is stopped. |
| 51 | bool m_deleteDeferred; |
| 52 | |
| 53 | // Private constructor because all providers are created through EventPipe::CreateProvider. |
| 54 | EventPipeProvider(EventPipeConfiguration *pConfig, const SString &providerName, EventPipeCallback pCallbackFunction = NULL, void *pCallbackData = NULL); |
| 55 | |
| 56 | public: |
| 57 | |
| 58 | ~EventPipeProvider(); |
| 59 | |
| 60 | // Get the provider Name. |
| 61 | const SString& GetProviderName() const; |
| 62 | |
| 63 | // Determine if the provider is enabled. |
| 64 | bool Enabled() const; |
| 65 | |
| 66 | // Determine if the specified keywords are enabled. |
| 67 | bool EventEnabled(INT64 keywords) const; |
| 68 | |
| 69 | // Determine if the specified keywords and level match the configuration. |
| 70 | bool EventEnabled(INT64 keywords, EventPipeEventLevel eventLevel) const; |
| 71 | |
| 72 | // Create a new event. |
| 73 | EventPipeEvent* AddEvent(unsigned int eventID, INT64 keywords, unsigned int eventVersion, EventPipeEventLevel level, BYTE *pMetadata = NULL, unsigned int metadataLength = 0); |
| 74 | |
| 75 | private: |
| 76 | |
| 77 | // Create a new event, but allow needStack to be specified. |
| 78 | // In general, we want stack walking to be controlled by the consumer and not the producer of events. |
| 79 | // However, there are a couple of cases that we know we don't want to do a stackwalk that would affect performance significantly: |
| 80 | // 1. Sample profiler events: The sample profiler already does a stack walk of the target thread. Doing one of the sampler thread is a waste. |
| 81 | // 2. Metadata events: These aren't as painful but because we have to keep this functionality around, might as well use it. |
| 82 | EventPipeEvent* AddEvent(unsigned int eventID, INT64 keywords, unsigned int eventVersion, EventPipeEventLevel level, bool needStack, BYTE *pMetadata = NULL, unsigned int metadataLength = 0); |
| 83 | |
| 84 | // Add an event to the provider. |
| 85 | void AddEvent(EventPipeEvent &event); |
| 86 | |
| 87 | // Set the provider configuration (enable and disable sets of events). |
| 88 | // This is called by EventPipeConfiguration. |
| 89 | void SetConfiguration(bool providerEnabled, INT64 keywords, EventPipeEventLevel providerLevel, LPCWSTR pFilterData); |
| 90 | |
| 91 | // Refresh the runtime state of all events. |
| 92 | void RefreshAllEvents(); |
| 93 | |
| 94 | // Invoke the provider callback. |
| 95 | void InvokeCallback(LPCWSTR pFilterData); |
| 96 | |
| 97 | // Specifies whether or not the provider was deleted, but that deletion |
| 98 | // was deferred until after tracing is stopped. |
| 99 | bool GetDeleteDeferred() const; |
| 100 | |
| 101 | // Defer deletion of the provider. |
| 102 | void SetDeleteDeferred(); |
| 103 | }; |
| 104 | |
| 105 | #endif // FEATURE_PERFTRACING |
| 106 | |
| 107 | #endif // __EVENTPIPE_PROVIDER_H__ |
| 108 | |