eventLevel = eventLevel.replace("win:", "EventPipeEventLevel::")
exclusionInfo = parseExclusionList(exclusionListFile)
taskName = eventNode.getAttribute('task')
- noStack = getStackWalkBit(
- providerName,
- taskName,
- eventName,
- exclusionInfo.nostack)
-
- initEvent = """ EventPipeEvent%s = EventPipeProvider%s->AddEvent(%s,%s,%s,%s,%d);
-""" % (eventName, providerPrettyName, eventKeywordsMask, eventValue, eventVersion, eventLevel, int(noStack))
+
+ initEvent = """ EventPipeEvent%s = EventPipeProvider%s->AddEvent(%s,%s,%s,%s);
+""" % (eventName, providerPrettyName, eventKeywordsMask, eventValue, eventVersion, eventLevel)
WriteEventImpl.append(initEvent)
WriteEventImpl.append("}")
InvokeCallback();
}
+EventPipeEvent* EventPipeProvider::AddEvent(INT64 keywords, unsigned int eventID, unsigned int eventVersion, EventPipeEventLevel level)
+{
+ CONTRACTL
+ {
+ THROWS;
+ GC_NOTRIGGER;
+ MODE_ANY;
+ }
+ CONTRACTL_END;
+
+ return AddEvent(keywords, eventID, eventVersion, level, true /* needStack */);
+}
+
EventPipeEvent* EventPipeProvider::AddEvent(INT64 keywords, unsigned int eventID, unsigned int eventVersion, EventPipeEventLevel level, bool needStack)
{
CONTRACTL
{
// Declare friends.
friend class EventPipeConfiguration;
+ friend class SampleProfiler;
private:
// The GUID of the provider.
bool EventEnabled(INT64 keywords, EventPipeEventLevel eventLevel) const;
// Create a new event.
- EventPipeEvent* AddEvent(INT64 keywords, unsigned int eventID, unsigned int eventVersion, EventPipeEventLevel level, bool needStack);
+ EventPipeEvent* AddEvent(INT64 keywords, unsigned int eventID, unsigned int eventVersion, EventPipeEventLevel level);
private:
+ // Create a new event, but allow needStack to be specified.
+ // In general, we want stack walking to be controlled by the consumer and not the producer of events.
+ // However, there are a couple of cases that we know we don't want to do a stackwalk that would affect performance significantly:
+ // 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.
+ // 2. Metadata events: These aren't as painful but because we have to keep this functionality around, might as well use it.
+ EventPipeEvent* AddEvent(INT64 keywords, unsigned int eventID, unsigned int eventVersion, EventPipeEventLevel level, bool needStack);
+
// Add an event to the provider.
void AddEvent(EventPipeEvent &event);