/// <summary>
        /// Get the corresponding ILStub Generated Event with the same process id and stub method
        /// id with the cache hit event.
        /// </summary>
        private ILStubGeneratedEvent GetGeneratedEvent(ILStubCacheHitTraceData cacheHitTraceData)
        {
            int hashCode = GetGeneratedEventHashCode(cacheHitTraceData.ProcessID,
                                                     cacheHitTraceData.StubMethodID);
            ILStubGeneratedEvent ilStubGeneratedEvent;

            if (m_ilStubGeneratedEventIndex.TryGetValue(hashCode, out ilStubGeneratedEvent))
            {
                return(ilStubGeneratedEvent);
            }
            else
            {
                return(null);
            }
        }
示例#2
0
 public ILStubCacheHitEvent(ILStubCacheHitTraceData traceData,
                            ILStubGeneratedEvent generatedEvent)
     : base(traceData)
 {
     m_ILStubGeneratedEvent        = generatedEvent;
     ClrInstanceId                 = traceData.ClrInstanceID;
     ManagedInteropMethodName      = traceData.ManagedInteropMethodName;
     ManagedInteropMethodNamespace = traceData.ManagedInteropMethodNamespace;
     ManagedSignature              = traceData.ManagedInteropMethodSignature;
     ManagedMethodToken            = traceData.ManagedInteropMethodToken;
     ModuleId     = traceData.ModuleID;
     StubMethodId = traceData.StubMethodID;
     if (m_ILStubGeneratedEvent != null)
     {
         NativeSignature     = m_ILStubGeneratedEvent.NativeSignature;
         StubGeneratedFlags  = m_ILStubGeneratedEvent.StubGeneratedFlags;
         StubMethodILCode    = m_ILStubGeneratedEvent.StubMethodILCode;
         StubMethodSignature = m_ILStubGeneratedEvent.StubMethodSignature;
     }
 }
        /// <summary>
        /// Record both ILStub Generated Event and ILStub CacheHit Event into our own DataStructure
        /// </summary>
        /// <param name="data"> The data structure constructed by TraceEvent library
        /// which presents a ETW event</param>
        private void AcceptILStubEvent(TraceEvent data)
        {
            ILStubEvent ilStubEvent = null;
            ILStubGeneratedTraceData ilStubGeneratedTraceData = data as ILStubGeneratedTraceData;

            if (ilStubGeneratedTraceData != null)
            {
                // record the IL Stub Generated event
                ilStubEvent = new ILStubGeneratedEvent(ilStubGeneratedTraceData);
            }
            else
            {
                ILStubCacheHitTraceData ilStubCacheHitTraceData = data as ILStubCacheHitTraceData;
                if (ilStubCacheHitTraceData != null)
                {
                    ILStubCacheHitTraceData cacheHitTraceData = ilStubCacheHitTraceData;
                    ILStubGeneratedEvent    generatedEvent    =
                        GetGeneratedEvent(cacheHitTraceData);
                    ilStubEvent = new ILStubCacheHitEvent(
                        cacheHitTraceData, generatedEvent);
                }
            }
            if (ilStubEvent != null)
            {
                lock (m_eventList)
                {
                    m_eventList.Insert(0, ilStubEvent);
                    ILStubGeneratedEvent ilStubGeneratedEvent = ilStubEvent as ILStubGeneratedEvent;
                    if (ilStubGeneratedEvent != null)
                    {
                        int hashCode = GetGeneratedEventHashCode(ilStubEvent.ProcessId,
                                                                 ilStubEvent.StubMethodId);
                        m_ilStubGeneratedEventIndex[hashCode] = ilStubGeneratedEvent;
                    }
                }
                // Fire the ILStub Event.
                ILStubEventHandler(ilStubEvent);
            }
        }