|
5 | 5 | // #define DEBUG_SERIALIZE
|
6 | 6 |
|
7 | 7 | using FastSerialization;
|
| 8 | +using Microsoft.Diagnostics.NETCore.Client; |
8 | 9 | using Microsoft.Diagnostics.Symbols;
|
9 | 10 | using Microsoft.Diagnostics.Tracing.Compatibility;
|
10 | 11 | using Microsoft.Diagnostics.Tracing.EventPipe;
|
@@ -153,7 +154,38 @@ public static TraceLog OpenOrConvert(string etlOrEtlxFilePath, TraceLogOptions o
|
153 | 154 | /// </summary>
|
154 | 155 | public static TraceLogEventSource CreateFromTraceEventSession(TraceEventSession session)
|
155 | 156 | {
|
156 |
| - var traceLog = new TraceLog(session); |
| 157 | + var traceLog = new TraceLog(session.Source); |
| 158 | + |
| 159 | + // See if we are on Win7 and have a separate kernel session associated with 'session' |
| 160 | + if (session.m_kernelSession != null) |
| 161 | + { |
| 162 | + // Make sure both sources only dispatch one at a time by taking a lock during dispatch. |
| 163 | + session.m_kernelSession.Source.lockObj = traceLog.realTimeQueue; |
| 164 | + session.m_associatedWithTraceLog = true; // Indicate that it is OK to have the m_kernelSession. |
| 165 | + session.Source.lockObj = traceLog.realTimeQueue; |
| 166 | + |
| 167 | + // Set up the callbacks to the kernel session. |
| 168 | + traceLog.rawKernelEventSource = session.m_kernelSession.Source; |
| 169 | + traceLog.SetupCallbacks(traceLog.rawKernelEventSource); |
| 170 | + traceLog.rawKernelEventSource.unhandledEventTemplate.traceEventSource = traceLog; // Make everything point to the log as its source. |
| 171 | + // TODO fixme - onAllEvents is local to the constructor |
| 172 | + // traceLog.rawKernelEventSource.AllEvents += traceLog.onAllEvents; |
| 173 | + } |
| 174 | + |
| 175 | + return traceLog.realTimeSource; |
| 176 | + } |
| 177 | + |
| 178 | + public static TraceLogEventSource CreateFromEventPipeSession(EventPipeSession session) |
| 179 | + { |
| 180 | + return CreateFromEventPipeEventSource(new EventPipeEventSource(session.EventStream)); |
| 181 | + } |
| 182 | + |
| 183 | + public static TraceLogEventSource CreateFromEventPipeEventSource(EventPipeEventSource source) |
| 184 | + { |
| 185 | + var traceLog = new TraceLog(source); |
| 186 | + var dynamicParser = source.Dynamic; |
| 187 | + var clrParser = source.Clr; |
| 188 | + var kernelParser = source.Kernel; |
157 | 189 | return traceLog.realTimeSource;
|
158 | 190 | }
|
159 | 191 |
|
@@ -543,7 +575,7 @@ private TraceLog()
|
543 | 575 | /// Functionality of TraceLog that does not depend on either remembering past EVENTS or require future
|
544 | 576 | /// knowledge (e.g. stacks of kernel events), will 'just work'.
|
545 | 577 | /// </summary>
|
546 |
| - private unsafe TraceLog(TraceEventSession session) |
| 578 | + private unsafe TraceLog(TraceEventDispatcher source) |
547 | 579 | : this()
|
548 | 580 | {
|
549 | 581 | IsRealTime = true;
|
@@ -605,23 +637,8 @@ private unsafe TraceLog(TraceEventSession session)
|
605 | 637 | }
|
606 | 638 | };
|
607 | 639 |
|
608 |
| - // See if we are on Win7 and have a separate kernel session associated with 'session' |
609 |
| - if (session.m_kernelSession != null) |
610 |
| - { |
611 |
| - // Make sure both sources only dispatch one at a time by taking a lock during dispatch. |
612 |
| - session.m_kernelSession.Source.lockObj = realTimeQueue; |
613 |
| - session.m_associatedWithTraceLog = true; // Indicate that it is OK to have the m_kernelSession. |
614 |
| - session.Source.lockObj = realTimeQueue; |
615 |
| - |
616 |
| - // Set up the callbacks to the kernel session. |
617 |
| - rawKernelEventSource = session.m_kernelSession.Source; |
618 |
| - SetupCallbacks(rawKernelEventSource); |
619 |
| - rawKernelEventSource.unhandledEventTemplate.traceEventSource = this; // Make everything point to the log as its source. |
620 |
| - rawKernelEventSource.AllEvents += onAllEvents; |
621 |
| - } |
622 |
| - |
623 | 640 | // We use the session's source for our input.
|
624 |
| - rawEventSourceToConvert = session.Source; |
| 641 | + rawEventSourceToConvert = source; |
625 | 642 | SetupCallbacks(rawEventSourceToConvert);
|
626 | 643 | rawEventSourceToConvert.unhandledEventTemplate.traceEventSource = this; // Make everything point to the log as its source.
|
627 | 644 | rawEventSourceToConvert.AllEvents += onAllEvents;
|
@@ -1081,16 +1098,27 @@ private unsafe void SetupCallbacks(TraceEventDispatcher rawEvents)
|
1081 | 1098 | sourceFilesByID = new Dictionary<JavaScriptSourceKey, string>();
|
1082 | 1099 |
|
1083 | 1100 | // If this is a ETL file, we also need to compute all the normal TraceLog stuff the raw stream
|
1084 |
| - pointerSize = rawEvents.PointerSize; |
1085 |
| - _syncTimeUTC = rawEvents._syncTimeUTC; |
1086 |
| - _syncTimeQPC = rawEvents._syncTimeQPC; |
1087 |
| - _QPCFreq = rawEvents._QPCFreq; |
1088 |
| - sessionStartTimeQPC = rawEvents.sessionStartTimeQPC; |
1089 |
| - sessionEndTimeQPC = rawEvents.sessionEndTimeQPC; |
1090 |
| - cpuSpeedMHz = rawEvents.CpuSpeedMHz; |
1091 |
| - numberOfProcessors = rawEvents.NumberOfProcessors; |
1092 |
| - eventsLost = rawEvents.EventsLost; |
1093 |
| - osVersion = rawEvents.OSVersion; |
| 1101 | + Action copyHeaders = delegate () |
| 1102 | + { |
| 1103 | + pointerSize = rawEvents.PointerSize; |
| 1104 | + _syncTimeUTC = rawEvents._syncTimeUTC; |
| 1105 | + _syncTimeQPC = rawEvents._syncTimeQPC; |
| 1106 | + _QPCFreq = rawEvents._QPCFreq; |
| 1107 | + sessionStartTimeQPC = rawEvents.sessionStartTimeQPC; |
| 1108 | + sessionEndTimeQPC = rawEvents.sessionEndTimeQPC; |
| 1109 | + cpuSpeedMHz = rawEvents.CpuSpeedMHz; |
| 1110 | + numberOfProcessors = rawEvents.NumberOfProcessors; |
| 1111 | + eventsLost = rawEvents.EventsLost; |
| 1112 | + osVersion = rawEvents.OSVersion; |
| 1113 | + }; |
| 1114 | + |
| 1115 | + if (rawEvents is EventPipeEventSource eventPipeEventSource) |
| 1116 | + { |
| 1117 | + eventPipeEventSource.HeadersDeserialized += copyHeaders; |
| 1118 | + } else |
| 1119 | + { |
| 1120 | + copyHeaders(); |
| 1121 | + } |
1094 | 1122 |
|
1095 | 1123 | // These parsers create state and we want to collect that so we put it on our 'parsers' list that we serialize.
|
1096 | 1124 | var kernelParser = rawEvents.Kernel;
|
|
0 commit comments