internal void OnClrPrivateEvent(TraceEvent data) { TraceEventID eventID = data.ID; HeapEvents heapEvent = HeapEvents.Unknown; // TODO don't use IDs but use individual callbacks. const TraceEventID GCDecisionEventID = (TraceEventID)1; const TraceEventID GCSettingsEventID = (TraceEventID)2; const TraceEventID GCOptimizedEventID = (TraceEventID)3; const TraceEventID GCPerHeapHistoryEventID = (TraceEventID)4; const TraceEventID GCGlobalHeapHistoryEventID = (TraceEventID)5; const TraceEventID GCJoinEventID = (TraceEventID)6; const TraceEventID GCMarkStackRootsEventID = (TraceEventID)7; const TraceEventID GCMarkFinalizeQueueRootsEventID = (TraceEventID)8; const TraceEventID GCMarkHandlesEventID = (TraceEventID)9; const TraceEventID GCMarkCardsEventID = (TraceEventID)10; const TraceEventID GCBGCStartEventID = (TraceEventID)11; const TraceEventID GCBGC1stNonCondStopEventID = (TraceEventID)12; const TraceEventID GCBGC1stConStopEventID = (TraceEventID)13; const TraceEventID GCBGC2ndNonConStartEventID = (TraceEventID)14; const TraceEventID GCBGC2ndNonConStopEventID = (TraceEventID)15; const TraceEventID GCBGC2ndConStartEventID = (TraceEventID)16; const TraceEventID GCBGC2ndConStopEventID = (TraceEventID)17; const TraceEventID GCBGCPlanStopEventID = (TraceEventID)18; const TraceEventID GCBGCSweepStopEventID = (TraceEventID)19; const TraceEventID GCBGCDrainMarkEventID = (TraceEventID)20; const TraceEventID GCBGCRevisitEventID = (TraceEventID)21; const TraceEventID GCBGCOverflowEventID = (TraceEventID)22; const TraceEventID GCBGCAllocWaitStartEventID = (TraceEventID)23; const TraceEventID GCBGCAllocWaitStopEventID = (TraceEventID)24; const TraceEventID GCFullNotifyEventID = (TraceEventID)25; switch (eventID) { case GCDecisionEventID: heapEvent = HeapEvents.GCDecision; break; case GCSettingsEventID: heapEvent = HeapEvents.GCSettings; break; case GCOptimizedEventID: heapEvent = HeapEvents.GCOptimized; { GCOptimizedTraceData mdata = data as GCOptimizedTraceData; if (mdata.GenerationNumber == 0) { m_g0Budget = mdata.DesiredAllocation; m_g0Alloc = mdata.NewAllocation; } else { m_g3Budget = mdata.DesiredAllocation; m_g3Alloc = mdata.NewAllocation; } } break; case GCPerHeapHistoryEventID: heapEvent = HeapEvents.GCPerHeapHistory; break; case GCGlobalHeapHistoryEventID: heapEvent = HeapEvents.GCGlobalHeapHistory; { GCGlobalHeapHistoryTraceData mdata = data as GCGlobalHeapHistoryTraceData; m_heapCount = mdata.NumHeaps; } break; case GCJoinEventID: heapEvent = HeapEvents.GCJoin; break; case GCMarkStackRootsEventID: heapEvent = HeapEvents.GCMarkStackRoots; break; case GCMarkFinalizeQueueRootsEventID: heapEvent = HeapEvents.GCMarkFinalizeQueueRoots; break; case GCMarkHandlesEventID: heapEvent = HeapEvents.GCMarkHandles; break; case GCMarkCardsEventID: heapEvent = HeapEvents.GCMarkCards; break; case GCBGCStartEventID: heapEvent = HeapEvents.BGCBegin; break; case GCBGC1stNonCondStopEventID: heapEvent = HeapEvents.BGC1stNonCondEnd; break; case GCBGC1stConStopEventID: heapEvent = HeapEvents.BGC1stConEnd; break; case GCBGC2ndNonConStartEventID: heapEvent = HeapEvents.BGC2ndNonConBegin; break; case GCBGC2ndNonConStopEventID: heapEvent = HeapEvents.BGC2ndNonConEnd; break; case GCBGC2ndConStartEventID: heapEvent = HeapEvents.BGC2ndConBegin; break; case GCBGC2ndConStopEventID: heapEvent = HeapEvents.BGC2ndConEnd; break; case GCBGCPlanStopEventID: heapEvent = HeapEvents.BGCPlanEnd; break; case GCBGCSweepStopEventID: heapEvent = HeapEvents.BGCSweepEnd; break; case GCBGCDrainMarkEventID: heapEvent = HeapEvents.BGCDrainMark; break; case GCBGCRevisitEventID: heapEvent = HeapEvents.BGCRevisit; break; case GCBGCOverflowEventID: heapEvent = HeapEvents.BGCOverflow; break; case GCBGCAllocWaitStartEventID: heapEvent = HeapEvents.BGCAllocWaitStart; break; case GCBGCAllocWaitStopEventID: heapEvent = HeapEvents.BGCAllocWaitStop; break; case GCFullNotifyEventID: heapEvent = HeapEvents.GCFullNotify; break; // FinalizeObject, // CCWRefCountChange, // SetGCHandle, // DestroyGCHandle, default: break; } if (heapEvent != HeapEvents.Unknown) { ThreadMemoryInfo thread = GetThread(data.ThreadID); thread.AddEvent(heapEvent, data.TimeStampRelativeMSec); } }
private void ProcessGlobalHistory(GCGlobalHeapHistoryTraceData data) { if (isServerGCUsed == -1) { // We detected whether we are using Server GC now. isServerGCUsed = ((data.NumHeaps > 1) ? 1 : 0); if (heapCount == -1) { heapCount = data.NumHeaps; } if (isServerGCUsed == 1) { serverGCThreads = new Dictionary<int, int>(data.NumHeaps); } } GCEvent _event = GetLastGC(); if (_event != null) { _event.GlobalHeapHistory = (GCGlobalHeapHistoryTraceData)data.Clone(); _event.SetHeapCount(heapCount); } }