diff --git a/src/TraceEvent/TraceEventSession.cs b/src/TraceEvent/TraceEventSession.cs index 8545ff0ee..4b5037c5d 100644 --- a/src/TraceEvent/TraceEventSession.cs +++ b/src/TraceEvent/TraceEventSession.cs @@ -1631,27 +1631,35 @@ internal static SortedDictionary ProviderNameToGuid { if (s_providersByName == null) { - s_providersByName = new SortedDictionary(StringComparer.OrdinalIgnoreCase); - int buffSize = 0; - var hr = TraceEventNativeMethods.TdhEnumerateProviders(null, ref buffSize); - Debug.Assert(hr == 122); // ERROR_INSUFFICIENT_BUFFER - var buffer = stackalloc byte[buffSize]; - var providersDesc = (TraceEventNativeMethods.PROVIDER_ENUMERATION_INFO*)buffer; - - hr = TraceEventNativeMethods.TdhEnumerateProviders(providersDesc, ref buffSize); - if ((hr == 0) && (providersDesc != null)) + lock (s_lock) { - var providers = (TraceEventNativeMethods.TRACE_PROVIDER_INFO*)&providersDesc[1]; - for (int i = 0; i < providersDesc->NumberOfProviders; i++) + if (s_providersByName == null) { - var name = new string((char*)&buffer[providers[i].ProviderNameOffset]); - s_providersByName[name] = providers[i].ProviderGuid; + SortedDictionary providersByName = new SortedDictionary(StringComparer.OrdinalIgnoreCase); + int buffSize = 0; + var hr = TraceEventNativeMethods.TdhEnumerateProviders(null, ref buffSize); + Debug.Assert(hr == 122); // ERROR_INSUFFICIENT_BUFFER + var buffer = stackalloc byte[buffSize]; + var providersDesc = (TraceEventNativeMethods.PROVIDER_ENUMERATION_INFO*)buffer; + + hr = TraceEventNativeMethods.TdhEnumerateProviders(providersDesc, ref buffSize); + if ((hr == 0) && (providersDesc != null)) + { + var providers = (TraceEventNativeMethods.TRACE_PROVIDER_INFO*)&providersDesc[1]; + for (int i = 0; i < providersDesc->NumberOfProviders; i++) + { + var name = new string((char*)&buffer[providers[i].ProviderNameOffset]); + providersByName[name] = providers[i].ProviderGuid; + } + + s_providersByName = providersByName; + } + else + { + Trace.WriteLine("TdhEnumerateProviders failed HR = " + hr); + } } } - else - { - Trace.WriteLine("TdhEnumerateProviders failed HR = " + hr); - } } return s_providersByName; } @@ -1663,10 +1671,18 @@ internal static Dictionary ProviderGuidToName { if (s_providerNames == null) { - s_providerNames = new Dictionary(ProviderNameToGuid.Count); - foreach (var keyValue in ProviderNameToGuid) + lock (s_lock) { - s_providerNames[keyValue.Value] = keyValue.Key; + if (s_providerNames == null) + { + Dictionary providerNames = new Dictionary(ProviderNameToGuid.Count); + foreach (var keyValue in ProviderNameToGuid) + { + providerNames[keyValue.Value] = keyValue.Key; + } + + s_providerNames = providerNames; + } } } return s_providerNames; @@ -1721,6 +1737,7 @@ private int ComputeEventIdsBufferSize(IList eventIds) return (eventIds.Count - 1) * 2 + sizeof(TraceEventNativeMethods.EVENT_FILTER_EVENT_ID); } + private static object s_lock = new object(); private static SortedDictionary s_providersByName; private static Dictionary s_providerNames;