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.
6 #include "eventpipeevent.h"
7 #include "eventpipeprovider.h"
9 #ifdef FEATURE_PERFTRACING
11 EventPipeEvent::EventPipeEvent(
12 EventPipeProvider &provider,
15 unsigned int eventVersion,
16 EventPipeEventLevel level,
19 unsigned int metadataLength) : m_pProvider(&provider),
22 m_eventVersion(eventVersion),
24 m_needStack(needStack),
33 PRECONDITION(&provider != nullptr);
37 if (pMetadata != nullptr)
39 m_pMetadata = new BYTE[metadataLength];
40 memcpy(m_pMetadata, pMetadata, metadataLength);
41 m_metadataLength = metadataLength;
45 // if metadata is not provided, we have to build the minimum version. It's required by the serialization contract
46 m_pMetadata = BuildMinimumMetadata();
47 m_metadataLength = MinimumMetadataLength;
51 EventPipeEvent::~EventPipeEvent()
64 BYTE *EventPipeEvent::BuildMinimumMetadata()
74 BYTE *minmumMetadata = new BYTE[MinimumMetadataLength];
75 BYTE *currentPtr = minmumMetadata;
77 // the order of fields is defined in coreclr\src\mscorlib\shared\System\Diagnostics\Tracing\EventSource.cs DefineEventPipeEvents method
78 memcpy(currentPtr, &m_eventID, sizeof(m_eventID));
79 currentPtr += sizeof(m_eventID);
81 SString eventName = SString::Empty();
82 unsigned int eventNameSize = (eventName.GetCount() + 1) * sizeof(WCHAR);
83 memcpy(currentPtr, (BYTE *)eventName.GetUnicode(), eventNameSize);
84 currentPtr += eventNameSize;
86 memcpy(currentPtr, &m_keywords, sizeof(m_keywords));
87 currentPtr += sizeof(m_keywords);
89 memcpy(currentPtr, &m_eventVersion, sizeof(m_eventVersion));
90 currentPtr += sizeof(m_eventVersion);
92 memcpy(currentPtr, &m_level, sizeof(m_level));
93 currentPtr += sizeof(m_level);
95 unsigned int noParameters = 0;
96 memcpy(currentPtr, &noParameters, sizeof(noParameters));
97 currentPtr += sizeof(noParameters);
99 return minmumMetadata;
102 EventPipeProvider *EventPipeEvent::GetProvider() const
104 LIMITED_METHOD_CONTRACT;
108 INT64 EventPipeEvent::GetKeywords() const
110 LIMITED_METHOD_CONTRACT;
114 unsigned int EventPipeEvent::GetEventID() const
116 LIMITED_METHOD_CONTRACT;
120 unsigned int EventPipeEvent::GetEventVersion() const
122 LIMITED_METHOD_CONTRACT;
123 return m_eventVersion;
126 EventPipeEventLevel EventPipeEvent::GetLevel() const
128 LIMITED_METHOD_CONTRACT;
132 bool EventPipeEvent::NeedStack() const
134 LIMITED_METHOD_CONTRACT;
138 bool EventPipeEvent::IsEnabled() const
140 LIMITED_METHOD_CONTRACT;
141 return m_enabledMask != 0;
144 BYTE *EventPipeEvent::GetMetadata() const
146 LIMITED_METHOD_CONTRACT;
150 unsigned int EventPipeEvent::GetMetadataLength() const
152 LIMITED_METHOD_CONTRACT;
153 return m_metadataLength;
156 void EventPipeEvent::RefreshState()
158 LIMITED_METHOD_CONTRACT;
159 _ASSERTE(EventPipe::IsLockOwnedByCurrentThread());
160 m_enabledMask = m_pProvider->ComputeEventEnabledMask(m_keywords, m_level);
163 bool EventPipeEvent::IsEnabled(uint64_t sessionMask) const
165 LIMITED_METHOD_CONTRACT;
166 _ASSERTE(m_pProvider != nullptr);
167 return (m_pProvider->IsEnabled(sessionMask) && (m_enabledMask & sessionMask) != 0);
170 #endif // FEATURE_PERFTRACING