summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Robbins <brianrob@microsoft.com>2017-05-12 14:14:28 -0700
committerGitHub <noreply@github.com>2017-05-12 14:14:28 -0700
commitc8f77deb64c8bf582a7a9a090dea6a8ad6c9be6b (patch)
tree83627400cd04b84d1544aca48b52e539996ca523
parentf90a27bfa18f078a39acd6fed57b9e9dd1adc8a9 (diff)
downloadcoreclr-c8f77deb64c8bf582a7a9a090dea6a8ad6c9be6b.tar.gz
coreclr-c8f77deb64c8bf582a7a9a090dea6a8ad6c9be6b.tar.bz2
coreclr-c8f77deb64c8bf582a7a9a090dea6a8ad6c9be6b.zip
Don't allow specification of needStack to EventPipeProvider when creating an event. (#11571)
-rw-r--r--src/scripts/genEventPipe.py11
-rw-r--r--src/vm/eventpipeprovider.cpp13
-rw-r--r--src/vm/eventpipeprovider.h10
3 files changed, 25 insertions, 9 deletions
diff --git a/src/scripts/genEventPipe.py b/src/scripts/genEventPipe.py
index 3a818ce1e0..02634adf8c 100644
--- a/src/scripts/genEventPipe.py
+++ b/src/scripts/genEventPipe.py
@@ -136,14 +136,9 @@ def generateClrEventPipeWriteEventsImpl(
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("}")
diff --git a/src/vm/eventpipeprovider.cpp b/src/vm/eventpipeprovider.cpp
index be87fb4db6..beee6fc1db 100644
--- a/src/vm/eventpipeprovider.cpp
+++ b/src/vm/eventpipeprovider.cpp
@@ -128,6 +128,19 @@ void EventPipeProvider::SetConfiguration(bool providerEnabled, INT64 keywords, E
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
diff --git a/src/vm/eventpipeprovider.h b/src/vm/eventpipeprovider.h
index 7aaa8e4d7f..464d011c39 100644
--- a/src/vm/eventpipeprovider.h
+++ b/src/vm/eventpipeprovider.h
@@ -26,6 +26,7 @@ class EventPipeProvider
{
// Declare friends.
friend class EventPipeConfiguration;
+ friend class SampleProfiler;
private:
// The GUID of the provider.
@@ -71,10 +72,17 @@ public:
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);