Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
            }
        }