|
|
@@ -7,13 +7,32 @@ using System.Threading; |
|
|
|
|
|
|
|
namespace Discord |
|
|
|
{ |
|
|
|
//Based on https://github.com/dotnet/corefx/blob/master/src/System.Collections.Concurrent/src/System/Collections/Concurrent/ConcurrentDictionary.cs |
|
|
|
//Based on https://github.com/dotnet/corefx/blob/d0dc5fc099946adc1035b34a8b1f6042eddb0c75/src/System.Threading.Tasks.Parallel/src/System/Threading/PlatformHelper.cs |
|
|
|
//Copyright (c) .NET Foundation and Contributors |
|
|
|
public static class ConcurrentHashSet |
|
|
|
{ |
|
|
|
public static int DefaultConcurrencyLevel => PlatformHelper.ProcessorCount; |
|
|
|
private const int PROCESSOR_COUNT_REFRESH_INTERVAL_MS = 30000; |
|
|
|
private static volatile int s_processorCount; |
|
|
|
private static volatile int s_lastProcessorCountRefreshTicks; |
|
|
|
|
|
|
|
public static int DefaultConcurrencyLevel |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
int now = Environment.TickCount; |
|
|
|
if (s_processorCount == 0 || (now - s_lastProcessorCountRefreshTicks) >= PROCESSOR_COUNT_REFRESH_INTERVAL_MS) |
|
|
|
{ |
|
|
|
s_processorCount = Environment.ProcessorCount; |
|
|
|
s_lastProcessorCountRefreshTicks = now; |
|
|
|
} |
|
|
|
|
|
|
|
return s_processorCount; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//Based on https://github.com/dotnet/corefx/blob/master/src/System.Collections.Concurrent/src/System/Collections/Concurrent/ConcurrentDictionary.cs |
|
|
|
//Copyright (c) .NET Foundation and Contributors |
|
|
|
[DebuggerDisplay("Count = {Count}")] |
|
|
|
internal class ConcurrentHashSet<T> : IReadOnlyCollection<T> |
|
|
|
{ |
|
|
@@ -57,7 +76,7 @@ namespace Discord |
|
|
|
bucketNo = (hashcode & 0x7fffffff) % bucketCount; |
|
|
|
lockNo = bucketNo % lockCount; |
|
|
|
} |
|
|
|
private static int DefaultConcurrencyLevel => PlatformHelper.ProcessorCount; |
|
|
|
private static int DefaultConcurrencyLevel => ConcurrentHashSet.DefaultConcurrencyLevel; |
|
|
|
|
|
|
|
private volatile Tables _tables; |
|
|
|
private readonly IEqualityComparer<T> _comparer; |
|
|
@@ -453,28 +472,4 @@ namespace Discord |
|
|
|
Monitor.Exit(_tables._locks[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//https://github.com/dotnet/corefx/blob/d0dc5fc099946adc1035b34a8b1f6042eddb0c75/src/System.Threading.Tasks.Parallel/src/System/Threading/PlatformHelper.cs |
|
|
|
//Copyright (c) .NET Foundation and Contributors |
|
|
|
internal static class PlatformHelper |
|
|
|
{ |
|
|
|
private const int PROCESSOR_COUNT_REFRESH_INTERVAL_MS = 30000; |
|
|
|
private static volatile int s_processorCount; |
|
|
|
private static volatile int s_lastProcessorCountRefreshTicks; |
|
|
|
|
|
|
|
internal static int ProcessorCount |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
int now = Environment.TickCount; |
|
|
|
if (s_processorCount == 0 || (now - s_lastProcessorCountRefreshTicks) >= PROCESSOR_COUNT_REFRESH_INTERVAL_MS) |
|
|
|
{ |
|
|
|
s_processorCount = Environment.ProcessorCount; |
|
|
|
s_lastProcessorCountRefreshTicks = now; |
|
|
|
} |
|
|
|
|
|
|
|
return s_processorCount; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |