smartThreadPool changes
This commit is contained in:
446
ThirdParty/SmartThreadPool/STPPerformanceCounter.cs
vendored
446
ThirdParty/SmartThreadPool/STPPerformanceCounter.cs
vendored
@@ -1,446 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace Amib.Threading
|
|
||||||
{
|
|
||||||
public interface ISTPPerformanceCountersReader
|
|
||||||
{
|
|
||||||
long InUseThreads { get; }
|
|
||||||
long ActiveThreads { get; }
|
|
||||||
long WorkItemsQueued { get; }
|
|
||||||
long WorkItemsProcessed { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Amib.Threading.Internal
|
|
||||||
{
|
|
||||||
internal interface ISTPInstancePerformanceCounters : IDisposable
|
|
||||||
{
|
|
||||||
void Close();
|
|
||||||
void SampleThreads(long activeThreads, long inUseThreads);
|
|
||||||
void SampleWorkItems(long workItemsQueued, long workItemsProcessed);
|
|
||||||
void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime);
|
|
||||||
void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal enum STPPerformanceCounterType
|
|
||||||
{
|
|
||||||
// Fields
|
|
||||||
ActiveThreads = 0,
|
|
||||||
InUseThreads = 1,
|
|
||||||
OverheadThreads = 2,
|
|
||||||
OverheadThreadsPercent = 3,
|
|
||||||
OverheadThreadsPercentBase = 4,
|
|
||||||
|
|
||||||
WorkItems = 5,
|
|
||||||
WorkItemsInQueue = 6,
|
|
||||||
WorkItemsProcessed = 7,
|
|
||||||
|
|
||||||
WorkItemsQueuedPerSecond = 8,
|
|
||||||
WorkItemsProcessedPerSecond = 9,
|
|
||||||
|
|
||||||
AvgWorkItemWaitTime = 10,
|
|
||||||
AvgWorkItemWaitTimeBase = 11,
|
|
||||||
|
|
||||||
AvgWorkItemProcessTime = 12,
|
|
||||||
AvgWorkItemProcessTimeBase = 13,
|
|
||||||
|
|
||||||
WorkItemsGroups = 14,
|
|
||||||
|
|
||||||
LastCounter = 14,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Summary description for STPPerformanceCounter.
|
|
||||||
/// </summary>
|
|
||||||
internal class STPPerformanceCounter
|
|
||||||
{
|
|
||||||
// Fields
|
|
||||||
private readonly PerformanceCounterType _pcType;
|
|
||||||
protected string _counterHelp;
|
|
||||||
protected string _counterName;
|
|
||||||
|
|
||||||
// Methods
|
|
||||||
public STPPerformanceCounter(
|
|
||||||
string counterName,
|
|
||||||
string counterHelp,
|
|
||||||
PerformanceCounterType pcType)
|
|
||||||
{
|
|
||||||
_counterName = counterName;
|
|
||||||
_counterHelp = counterHelp;
|
|
||||||
_pcType = pcType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCounterToCollection(CounterCreationDataCollection counterData)
|
|
||||||
{
|
|
||||||
CounterCreationData counterCreationData = new CounterCreationData(
|
|
||||||
_counterName,
|
|
||||||
_counterHelp,
|
|
||||||
_pcType);
|
|
||||||
|
|
||||||
counterData.Add(counterCreationData);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Properties
|
|
||||||
public string Name
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _counterName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class STPPerformanceCounters
|
|
||||||
{
|
|
||||||
// Fields
|
|
||||||
internal STPPerformanceCounter[] _stpPerformanceCounters;
|
|
||||||
private static readonly STPPerformanceCounters _instance;
|
|
||||||
internal const string _stpCategoryHelp = "SmartThreadPool performance counters";
|
|
||||||
internal const string _stpCategoryName = "SmartThreadPool";
|
|
||||||
|
|
||||||
// Methods
|
|
||||||
static STPPerformanceCounters()
|
|
||||||
{
|
|
||||||
_instance = new STPPerformanceCounters();
|
|
||||||
}
|
|
||||||
|
|
||||||
private STPPerformanceCounters()
|
|
||||||
{
|
|
||||||
STPPerformanceCounter[] stpPerformanceCounters = new STPPerformanceCounter[]
|
|
||||||
{
|
|
||||||
new STPPerformanceCounter("Active threads", "The current number of available in the thread pool.", PerformanceCounterType.NumberOfItems32),
|
|
||||||
new STPPerformanceCounter("In use threads", "The current number of threads that execute a work item.", PerformanceCounterType.NumberOfItems32),
|
|
||||||
new STPPerformanceCounter("Overhead threads", "The current number of threads that are active, but are not in use.", PerformanceCounterType.NumberOfItems32),
|
|
||||||
new STPPerformanceCounter("% overhead threads", "The current number of threads that are active, but are not in use in percents.", PerformanceCounterType.RawFraction),
|
|
||||||
new STPPerformanceCounter("% overhead threads base", "The current number of threads that are active, but are not in use in percents.", PerformanceCounterType.RawBase),
|
|
||||||
|
|
||||||
new STPPerformanceCounter("Work Items", "The number of work items in the Smart Thread Pool. Both queued and processed.", PerformanceCounterType.NumberOfItems32),
|
|
||||||
new STPPerformanceCounter("Work Items in queue", "The current number of work items in the queue", PerformanceCounterType.NumberOfItems32),
|
|
||||||
new STPPerformanceCounter("Work Items processed", "The number of work items already processed", PerformanceCounterType.NumberOfItems32),
|
|
||||||
|
|
||||||
new STPPerformanceCounter("Work Items queued/sec", "The number of work items queued per second", PerformanceCounterType.RateOfCountsPerSecond32),
|
|
||||||
new STPPerformanceCounter("Work Items processed/sec", "The number of work items processed per second", PerformanceCounterType.RateOfCountsPerSecond32),
|
|
||||||
|
|
||||||
new STPPerformanceCounter("Avg. Work Item wait time/sec", "The average time a work item supends in the queue waiting for its turn to execute.", PerformanceCounterType.AverageCount64),
|
|
||||||
new STPPerformanceCounter("Avg. Work Item wait time base", "The average time a work item supends in the queue waiting for its turn to execute.", PerformanceCounterType.AverageBase),
|
|
||||||
|
|
||||||
new STPPerformanceCounter("Avg. Work Item process time/sec", "The average time it takes to process a work item.", PerformanceCounterType.AverageCount64),
|
|
||||||
new STPPerformanceCounter("Avg. Work Item process time base", "The average time it takes to process a work item.", PerformanceCounterType.AverageBase),
|
|
||||||
|
|
||||||
new STPPerformanceCounter("Work Items Groups", "The current number of work item groups associated with the Smart Thread Pool.", PerformanceCounterType.NumberOfItems32),
|
|
||||||
};
|
|
||||||
|
|
||||||
_stpPerformanceCounters = stpPerformanceCounters;
|
|
||||||
SetupCategory();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetupCategory()
|
|
||||||
{
|
|
||||||
if (!PerformanceCounterCategory.Exists(_stpCategoryName))
|
|
||||||
{
|
|
||||||
CounterCreationDataCollection counters = new CounterCreationDataCollection();
|
|
||||||
|
|
||||||
for (int i = 0; i < _stpPerformanceCounters.Length; i++)
|
|
||||||
{
|
|
||||||
_stpPerformanceCounters[i].AddCounterToCollection(counters);
|
|
||||||
}
|
|
||||||
|
|
||||||
PerformanceCounterCategory.Create(
|
|
||||||
_stpCategoryName,
|
|
||||||
_stpCategoryHelp,
|
|
||||||
PerformanceCounterCategoryType.MultiInstance,
|
|
||||||
counters);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Properties
|
|
||||||
public static STPPerformanceCounters Instance
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class STPInstancePerformanceCounter : IDisposable
|
|
||||||
{
|
|
||||||
// Fields
|
|
||||||
private bool _isDisposed;
|
|
||||||
private PerformanceCounter _pcs;
|
|
||||||
|
|
||||||
// Methods
|
|
||||||
protected STPInstancePerformanceCounter()
|
|
||||||
{
|
|
||||||
_isDisposed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public STPInstancePerformanceCounter(
|
|
||||||
string instance,
|
|
||||||
STPPerformanceCounterType spcType) : this()
|
|
||||||
{
|
|
||||||
STPPerformanceCounters counters = STPPerformanceCounters.Instance;
|
|
||||||
_pcs = new PerformanceCounter(
|
|
||||||
STPPerformanceCounters._stpCategoryName,
|
|
||||||
counters._stpPerformanceCounters[(int) spcType].Name,
|
|
||||||
instance,
|
|
||||||
false);
|
|
||||||
_pcs.RawValue = _pcs.RawValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void Close()
|
|
||||||
{
|
|
||||||
if (_pcs != null)
|
|
||||||
{
|
|
||||||
_pcs.RemoveInstance();
|
|
||||||
_pcs.Close();
|
|
||||||
_pcs = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Dispose(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (!_isDisposed)
|
|
||||||
{
|
|
||||||
if (disposing)
|
|
||||||
{
|
|
||||||
Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_isDisposed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void Increment()
|
|
||||||
{
|
|
||||||
_pcs.Increment();
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void IncrementBy(long val)
|
|
||||||
{
|
|
||||||
_pcs.IncrementBy(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void Set(long val)
|
|
||||||
{
|
|
||||||
_pcs.RawValue = val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class STPInstanceNullPerformanceCounter : STPInstancePerformanceCounter
|
|
||||||
{
|
|
||||||
// Methods
|
|
||||||
public override void Increment() {}
|
|
||||||
public override void IncrementBy(long value) {}
|
|
||||||
public override void Set(long val) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
internal class STPInstancePerformanceCounters : ISTPInstancePerformanceCounters
|
|
||||||
{
|
|
||||||
private bool _isDisposed;
|
|
||||||
// Fields
|
|
||||||
private STPInstancePerformanceCounter[] _pcs;
|
|
||||||
private static readonly STPInstancePerformanceCounter _stpInstanceNullPerformanceCounter;
|
|
||||||
|
|
||||||
// Methods
|
|
||||||
static STPInstancePerformanceCounters()
|
|
||||||
{
|
|
||||||
_stpInstanceNullPerformanceCounter = new STPInstanceNullPerformanceCounter();
|
|
||||||
}
|
|
||||||
|
|
||||||
public STPInstancePerformanceCounters(string instance)
|
|
||||||
{
|
|
||||||
_isDisposed = false;
|
|
||||||
_pcs = new STPInstancePerformanceCounter[(int)STPPerformanceCounterType.LastCounter];
|
|
||||||
|
|
||||||
// Call the STPPerformanceCounters.Instance so the static constructor will
|
|
||||||
// intialize the STPPerformanceCounters singleton.
|
|
||||||
STPPerformanceCounters.Instance.GetHashCode();
|
|
||||||
|
|
||||||
for (int i = 0; i < _pcs.Length; i++)
|
|
||||||
{
|
|
||||||
if (instance != null)
|
|
||||||
{
|
|
||||||
_pcs[i] = new STPInstancePerformanceCounter(
|
|
||||||
instance,
|
|
||||||
(STPPerformanceCounterType) i);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_pcs[i] = _stpInstanceNullPerformanceCounter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void Close()
|
|
||||||
{
|
|
||||||
if (null != _pcs)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < _pcs.Length; i++)
|
|
||||||
{
|
|
||||||
if (null != _pcs[i])
|
|
||||||
{
|
|
||||||
_pcs[i].Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_pcs = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Dispose(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (!_isDisposed)
|
|
||||||
{
|
|
||||||
if (disposing)
|
|
||||||
{
|
|
||||||
Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_isDisposed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private STPInstancePerformanceCounter GetCounter(STPPerformanceCounterType spcType)
|
|
||||||
{
|
|
||||||
return _pcs[(int) spcType];
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SampleThreads(long activeThreads, long inUseThreads)
|
|
||||||
{
|
|
||||||
GetCounter(STPPerformanceCounterType.ActiveThreads).Set(activeThreads);
|
|
||||||
GetCounter(STPPerformanceCounterType.InUseThreads).Set(inUseThreads);
|
|
||||||
GetCounter(STPPerformanceCounterType.OverheadThreads).Set(activeThreads-inUseThreads);
|
|
||||||
|
|
||||||
GetCounter(STPPerformanceCounterType.OverheadThreadsPercentBase).Set(activeThreads-inUseThreads);
|
|
||||||
GetCounter(STPPerformanceCounterType.OverheadThreadsPercent).Set(inUseThreads);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SampleWorkItems(long workItemsQueued, long workItemsProcessed)
|
|
||||||
{
|
|
||||||
GetCounter(STPPerformanceCounterType.WorkItems).Set(workItemsQueued+workItemsProcessed);
|
|
||||||
GetCounter(STPPerformanceCounterType.WorkItemsInQueue).Set(workItemsQueued);
|
|
||||||
GetCounter(STPPerformanceCounterType.WorkItemsProcessed).Set(workItemsProcessed);
|
|
||||||
|
|
||||||
GetCounter(STPPerformanceCounterType.WorkItemsQueuedPerSecond).Set(workItemsQueued);
|
|
||||||
GetCounter(STPPerformanceCounterType.WorkItemsProcessedPerSecond).Set(workItemsProcessed);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime)
|
|
||||||
{
|
|
||||||
GetCounter(STPPerformanceCounterType.AvgWorkItemWaitTime).IncrementBy((long)workItemWaitTime.TotalMilliseconds);
|
|
||||||
GetCounter(STPPerformanceCounterType.AvgWorkItemWaitTimeBase).Increment();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime)
|
|
||||||
{
|
|
||||||
GetCounter(STPPerformanceCounterType.AvgWorkItemProcessTime).IncrementBy((long)workItemProcessTime.TotalMilliseconds);
|
|
||||||
GetCounter(STPPerformanceCounterType.AvgWorkItemProcessTimeBase).Increment();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class NullSTPInstancePerformanceCounters : ISTPInstancePerformanceCounters, ISTPPerformanceCountersReader
|
|
||||||
{
|
|
||||||
private static readonly NullSTPInstancePerformanceCounters _instance = new NullSTPInstancePerformanceCounters();
|
|
||||||
|
|
||||||
public static NullSTPInstancePerformanceCounters Instance
|
|
||||||
{
|
|
||||||
get { return _instance; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Close() {}
|
|
||||||
public void Dispose() {}
|
|
||||||
|
|
||||||
public void SampleThreads(long activeThreads, long inUseThreads) {}
|
|
||||||
public void SampleWorkItems(long workItemsQueued, long workItemsProcessed) {}
|
|
||||||
public void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime) {}
|
|
||||||
public void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime) {}
|
|
||||||
public long InUseThreads
|
|
||||||
{
|
|
||||||
get { return 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public long ActiveThreads
|
|
||||||
{
|
|
||||||
get { return 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public long WorkItemsQueued
|
|
||||||
{
|
|
||||||
get { return 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public long WorkItemsProcessed
|
|
||||||
{
|
|
||||||
get { return 0; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class LocalSTPInstancePerformanceCounters : ISTPInstancePerformanceCounters, ISTPPerformanceCountersReader
|
|
||||||
{
|
|
||||||
public void Close() { }
|
|
||||||
public void Dispose() { }
|
|
||||||
|
|
||||||
private long _activeThreads;
|
|
||||||
private long _inUseThreads;
|
|
||||||
private long _workItemsQueued;
|
|
||||||
private long _workItemsProcessed;
|
|
||||||
|
|
||||||
public long InUseThreads
|
|
||||||
{
|
|
||||||
get { return _inUseThreads; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public long ActiveThreads
|
|
||||||
{
|
|
||||||
get { return _activeThreads; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public long WorkItemsQueued
|
|
||||||
{
|
|
||||||
get { return _workItemsQueued; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public long WorkItemsProcessed
|
|
||||||
{
|
|
||||||
get { return _workItemsProcessed; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SampleThreads(long activeThreads, long inUseThreads)
|
|
||||||
{
|
|
||||||
_activeThreads = activeThreads;
|
|
||||||
_inUseThreads = inUseThreads;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SampleWorkItems(long workItemsQueued, long workItemsProcessed)
|
|
||||||
{
|
|
||||||
_workItemsQueued = workItemsQueued;
|
|
||||||
_workItemsProcessed = workItemsProcessed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SampleWorkItemsWaitTime(TimeSpan workItemWaitTime)
|
|
||||||
{
|
|
||||||
// Not supported
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SampleWorkItemsProcessTime(TimeSpan workItemProcessTime)
|
|
||||||
{
|
|
||||||
// Not supported
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
35
ThirdParty/SmartThreadPool/STPStartInfo.cs
vendored
35
ThirdParty/SmartThreadPool/STPStartInfo.cs
vendored
@@ -12,16 +12,13 @@ namespace Amib.Threading
|
|||||||
private int _minWorkerThreads = SmartThreadPool.DefaultMinWorkerThreads;
|
private int _minWorkerThreads = SmartThreadPool.DefaultMinWorkerThreads;
|
||||||
private int _maxWorkerThreads = SmartThreadPool.DefaultMaxWorkerThreads;
|
private int _maxWorkerThreads = SmartThreadPool.DefaultMaxWorkerThreads;
|
||||||
private ThreadPriority _threadPriority = SmartThreadPool.DefaultThreadPriority;
|
private ThreadPriority _threadPriority = SmartThreadPool.DefaultThreadPriority;
|
||||||
private string _performanceCounterInstanceName = SmartThreadPool.DefaultPerformanceCounterInstanceName;
|
|
||||||
private bool _areThreadsBackground = SmartThreadPool.DefaultAreThreadsBackground;
|
private bool _areThreadsBackground = SmartThreadPool.DefaultAreThreadsBackground;
|
||||||
private bool _enableLocalPerformanceCounters;
|
|
||||||
private string _threadPoolName = SmartThreadPool.DefaultThreadPoolName;
|
private string _threadPoolName = SmartThreadPool.DefaultThreadPoolName;
|
||||||
private int? _maxStackSize = SmartThreadPool.DefaultMaxStackSize;
|
private int? _maxStackSize = SmartThreadPool.DefaultMaxStackSize;
|
||||||
private bool _supressflow = false;
|
private bool _supressflow = false;
|
||||||
|
|
||||||
public STPStartInfo()
|
public STPStartInfo()
|
||||||
{
|
{
|
||||||
_performanceCounterInstanceName = SmartThreadPool.DefaultPerformanceCounterInstanceName;
|
|
||||||
_threadPriority = SmartThreadPool.DefaultThreadPriority;
|
_threadPriority = SmartThreadPool.DefaultThreadPriority;
|
||||||
_maxWorkerThreads = SmartThreadPool.DefaultMaxWorkerThreads;
|
_maxWorkerThreads = SmartThreadPool.DefaultMaxWorkerThreads;
|
||||||
_idleTimeout = SmartThreadPool.DefaultIdleTimeout;
|
_idleTimeout = SmartThreadPool.DefaultIdleTimeout;
|
||||||
@@ -35,8 +32,6 @@ namespace Amib.Threading
|
|||||||
_minWorkerThreads = stpStartInfo.MinWorkerThreads;
|
_minWorkerThreads = stpStartInfo.MinWorkerThreads;
|
||||||
_maxWorkerThreads = stpStartInfo.MaxWorkerThreads;
|
_maxWorkerThreads = stpStartInfo.MaxWorkerThreads;
|
||||||
_threadPriority = stpStartInfo.ThreadPriority;
|
_threadPriority = stpStartInfo.ThreadPriority;
|
||||||
_performanceCounterInstanceName = stpStartInfo.PerformanceCounterInstanceName;
|
|
||||||
_enableLocalPerformanceCounters = stpStartInfo._enableLocalPerformanceCounters;
|
|
||||||
_threadPoolName = stpStartInfo._threadPoolName;
|
_threadPoolName = stpStartInfo._threadPoolName;
|
||||||
_areThreadsBackground = stpStartInfo.AreThreadsBackground;
|
_areThreadsBackground = stpStartInfo.AreThreadsBackground;
|
||||||
_apartmentState = stpStartInfo._apartmentState;
|
_apartmentState = stpStartInfo._apartmentState;
|
||||||
@@ -110,36 +105,6 @@ namespace Amib.Threading
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get/Set the performance counter instance name of this SmartThreadPool
|
|
||||||
/// The default is null which indicate not to use performance counters at all.
|
|
||||||
/// </summary>
|
|
||||||
public virtual string PerformanceCounterInstanceName
|
|
||||||
{
|
|
||||||
get { return _performanceCounterInstanceName; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
ThrowIfReadOnly();
|
|
||||||
_performanceCounterInstanceName = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Enable/Disable the local performance counter.
|
|
||||||
/// This enables the user to get some performance information about the SmartThreadPool
|
|
||||||
/// without using Windows performance counters. (Useful on WindowsCE, Silverlight, etc.)
|
|
||||||
/// The default is false.
|
|
||||||
/// </summary>
|
|
||||||
public virtual bool EnableLocalPerformanceCounters
|
|
||||||
{
|
|
||||||
get { return _enableLocalPerformanceCounters; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
ThrowIfReadOnly();
|
|
||||||
_enableLocalPerformanceCounters = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get/Set backgroundness of thread in thread pool.
|
/// Get/Set backgroundness of thread in thread pool.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
85
ThirdParty/SmartThreadPool/SmartThreadPool.cs
vendored
85
ThirdParty/SmartThreadPool/SmartThreadPool.cs
vendored
@@ -281,16 +281,6 @@ namespace Amib.Threading
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private CanceledWorkItemsGroup _canceledSmartThreadPool = new CanceledWorkItemsGroup();
|
private CanceledWorkItemsGroup _canceledSmartThreadPool = new CanceledWorkItemsGroup();
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Windows STP performance counters
|
|
||||||
/// </summary>
|
|
||||||
private ISTPInstancePerformanceCounters _windowsPCs = NullSTPInstancePerformanceCounters.Instance;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Local STP performance counters
|
|
||||||
/// </summary>
|
|
||||||
private ISTPInstancePerformanceCounters _localPCs = NullSTPInstancePerformanceCounters.Instance;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// An event to call after a thread is created, but before
|
/// An event to call after a thread is created, but before
|
||||||
/// it's first use.
|
/// it's first use.
|
||||||
@@ -397,24 +387,6 @@ namespace Amib.Threading
|
|||||||
|
|
||||||
_isSuspended = _stpStartInfo.StartSuspended;
|
_isSuspended = _stpStartInfo.StartSuspended;
|
||||||
|
|
||||||
if (null != _stpStartInfo.PerformanceCounterInstanceName)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_windowsPCs = new STPInstancePerformanceCounters(_stpStartInfo.PerformanceCounterInstanceName);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.WriteLine("Unable to create Performance Counters: " + e);
|
|
||||||
_windowsPCs = NullSTPInstancePerformanceCounters.Instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_stpStartInfo.EnableLocalPerformanceCounters)
|
|
||||||
{
|
|
||||||
_localPCs = new LocalSTPInstancePerformanceCounters();
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the STP is not started suspended then start the threads.
|
// If the STP is not started suspended then start the threads.
|
||||||
if (!_isSuspended)
|
if (!_isSuspended)
|
||||||
{
|
{
|
||||||
@@ -511,9 +483,6 @@ namespace Amib.Threading
|
|||||||
|
|
||||||
private void IncrementWorkItemsCount()
|
private void IncrementWorkItemsCount()
|
||||||
{
|
{
|
||||||
_windowsPCs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
|
|
||||||
_localPCs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
|
|
||||||
|
|
||||||
int count = Interlocked.Increment(ref _currentWorkItemsCount);
|
int count = Interlocked.Increment(ref _currentWorkItemsCount);
|
||||||
//Trace.WriteLine("WorkItemsCount = " + _currentWorkItemsCount.ToString());
|
//Trace.WriteLine("WorkItemsCount = " + _currentWorkItemsCount.ToString());
|
||||||
if (count == 1)
|
if (count == 1)
|
||||||
@@ -534,14 +503,6 @@ namespace Amib.Threading
|
|||||||
}
|
}
|
||||||
|
|
||||||
Interlocked.Increment(ref _workItemsProcessed);
|
Interlocked.Increment(ref _workItemsProcessed);
|
||||||
|
|
||||||
if (!_shutdown)
|
|
||||||
{
|
|
||||||
// The counter counts even if the work item was cancelled
|
|
||||||
_windowsPCs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
|
|
||||||
_localPCs.SampleWorkItems(_workItemsQueue.Count, _workItemsProcessed);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private int baseWorkIDs = Environment.TickCount;
|
private int baseWorkIDs = Environment.TickCount;
|
||||||
@@ -572,8 +533,6 @@ namespace Amib.Threading
|
|||||||
if (_workerThreads.TryRemove(Thread.CurrentThread.ManagedThreadId, out ThreadEntry te))
|
if (_workerThreads.TryRemove(Thread.CurrentThread.ManagedThreadId, out ThreadEntry te))
|
||||||
{
|
{
|
||||||
te.Clean();
|
te.Clean();
|
||||||
_windowsPCs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads);
|
|
||||||
_localPCs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -644,9 +603,6 @@ namespace Amib.Threading
|
|||||||
_workerThreads[workerThread.ManagedThreadId] = new ThreadEntry(this, workerThread);
|
_workerThreads[workerThread.ManagedThreadId] = new ThreadEntry(this, workerThread);
|
||||||
|
|
||||||
workerThread.Start();
|
workerThread.Start();
|
||||||
|
|
||||||
_windowsPCs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads);
|
|
||||||
_localPCs.SampleThreads(_workerThreads.Count, _inUseWorkerThreads);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -755,8 +711,6 @@ namespace Amib.Threading
|
|||||||
// Execute the callback. Make sure to accurately
|
// Execute the callback. Make sure to accurately
|
||||||
// record how many callbacks are currently executing.
|
// record how many callbacks are currently executing.
|
||||||
int inUseWorkerThreads = Interlocked.Increment(ref _inUseWorkerThreads);
|
int inUseWorkerThreads = Interlocked.Increment(ref _inUseWorkerThreads);
|
||||||
_windowsPCs.SampleThreads(_workerThreads.Count, inUseWorkerThreads);
|
|
||||||
_localPCs.SampleThreads(_workerThreads.Count, inUseWorkerThreads);
|
|
||||||
|
|
||||||
// Mark that the _inUseWorkerThreads incremented, so in the finally{}
|
// Mark that the _inUseWorkerThreads incremented, so in the finally{}
|
||||||
// statement we will decrement it correctly.
|
// statement we will decrement it correctly.
|
||||||
@@ -785,8 +739,6 @@ namespace Amib.Threading
|
|||||||
if (bInUseWorkerThreadsWasIncremented)
|
if (bInUseWorkerThreadsWasIncremented)
|
||||||
{
|
{
|
||||||
int inUseWorkerThreads = Interlocked.Decrement(ref _inUseWorkerThreads);
|
int inUseWorkerThreads = Interlocked.Decrement(ref _inUseWorkerThreads);
|
||||||
_windowsPCs.SampleThreads(_workerThreads.Count, inUseWorkerThreads);
|
|
||||||
_localPCs.SampleThreads(_workerThreads.Count, inUseWorkerThreads);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notify that the work item has been completed.
|
// Notify that the work item has been completed.
|
||||||
@@ -799,12 +751,14 @@ namespace Amib.Threading
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
catch (ThreadAbortException tae)
|
catch (ThreadAbortException tae)
|
||||||
{
|
{
|
||||||
tae.GetHashCode();
|
//tae.GetHashCode();
|
||||||
// Handle the abort exception gracfully.
|
// Handle the abort exception gracfully.
|
||||||
Thread.ResetAbort();
|
//Thread.ResetAbort();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Assert(null != e);
|
Debug.Assert(null != e);
|
||||||
@@ -821,16 +775,12 @@ namespace Amib.Threading
|
|||||||
|
|
||||||
private void ExecuteWorkItem(WorkItem workItem)
|
private void ExecuteWorkItem(WorkItem workItem)
|
||||||
{
|
{
|
||||||
_windowsPCs.SampleWorkItemsWaitTime(workItem.WaitingTime);
|
|
||||||
_localPCs.SampleWorkItemsWaitTime(workItem.WaitingTime);
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
workItem.Execute();
|
workItem.Execute();
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
_windowsPCs.SampleWorkItemsProcessTime(workItem.ProcessTime);
|
|
||||||
_localPCs.SampleWorkItemsProcessTime(workItem.ProcessTime);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -888,17 +838,6 @@ namespace Amib.Threading
|
|||||||
{
|
{
|
||||||
ValidateNotDisposed();
|
ValidateNotDisposed();
|
||||||
|
|
||||||
ISTPInstancePerformanceCounters pcs = _windowsPCs;
|
|
||||||
|
|
||||||
if (NullSTPInstancePerformanceCounters.Instance != _windowsPCs)
|
|
||||||
{
|
|
||||||
// Set the _pcs to "null" to stop updating the performance
|
|
||||||
// counters
|
|
||||||
_windowsPCs = NullSTPInstancePerformanceCounters.Instance;
|
|
||||||
|
|
||||||
pcs.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
ThreadEntry[] threadEntries;
|
ThreadEntry[] threadEntries;
|
||||||
lock (_workerThreadsLock)
|
lock (_workerThreadsLock)
|
||||||
{
|
{
|
||||||
@@ -960,7 +899,7 @@ namespace Amib.Threading
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
thread.Abort(); // Shutdown
|
//thread.Abort(); // Shutdown
|
||||||
te.WorkThread = null;
|
te.WorkThread = null;
|
||||||
}
|
}
|
||||||
catch (SecurityException e)
|
catch (SecurityException e)
|
||||||
@@ -1334,7 +1273,7 @@ namespace Amib.Threading
|
|||||||
{
|
{
|
||||||
if (IsWorkItemCanceled)
|
if (IsWorkItemCanceled)
|
||||||
{
|
{
|
||||||
Thread.CurrentThread.Abort();
|
//Thread.CurrentThread.Abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1354,15 +1293,6 @@ namespace Amib.Threading
|
|||||||
get { return _shutdown; }
|
get { return _shutdown; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return the local calculated performance counters
|
|
||||||
/// Available only if STPStartInfo.EnableLocalPerformanceCounters is true.
|
|
||||||
/// </summary>
|
|
||||||
public ISTPPerformanceCountersReader PerformanceCountersReader
|
|
||||||
{
|
|
||||||
get { return (ISTPPerformanceCountersReader)_localPCs; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region IDisposable Members
|
#region IDisposable Members
|
||||||
@@ -1395,9 +1325,6 @@ namespace Amib.Threading
|
|||||||
_isIdleWaitHandle = null;
|
_isIdleWaitHandle = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_stpStartInfo.EnableLocalPerformanceCounters)
|
|
||||||
_localPCs.Dispose();
|
|
||||||
|
|
||||||
_isDisposed = true;
|
_isDisposed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
13
ThirdParty/SmartThreadPool/WorkItem.cs
vendored
13
ThirdParty/SmartThreadPool/WorkItem.cs
vendored
@@ -427,12 +427,11 @@ namespace Amib.Threading.Internal
|
|||||||
// If we got a ThreadAbortException and the STP is not shutting down, it means the
|
// If we got a ThreadAbortException and the STP is not shutting down, it means the
|
||||||
// work items was cancelled.
|
// work items was cancelled.
|
||||||
tae.GetHashCode();
|
tae.GetHashCode();
|
||||||
if (!SmartThreadPool.CurrentThreadEntry.AssociatedSmartThreadPool.IsShuttingdown)
|
//if (!SmartThreadPool.CurrentThreadEntry.AssociatedSmartThreadPool.IsShuttingdown)
|
||||||
{
|
//{
|
||||||
Thread.ResetAbort();
|
// Thread.ResetAbort();
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!SmartThreadPool.IsWorkItemCanceled)
|
if (!SmartThreadPool.IsWorkItemCanceled)
|
||||||
{
|
{
|
||||||
SetResult(result, exception);
|
SetResult(result, exception);
|
||||||
@@ -728,7 +727,7 @@ namespace Amib.Threading.Internal
|
|||||||
Thread executionThread = Interlocked.CompareExchange(ref _executingThread, null, _executingThread);
|
Thread executionThread = Interlocked.CompareExchange(ref _executingThread, null, _executingThread);
|
||||||
if (null != executionThread)
|
if (null != executionThread)
|
||||||
{
|
{
|
||||||
executionThread.Abort(); // "Cancel"
|
//executionThread.Abort(); // "Cancel"
|
||||||
// No need to signalComplete, because we already cancelled this work item
|
// No need to signalComplete, because we already cancelled this work item
|
||||||
// so it already signaled its completion.
|
// so it already signaled its completion.
|
||||||
//signalComplete = true;
|
//signalComplete = true;
|
||||||
@@ -745,7 +744,7 @@ namespace Amib.Threading.Internal
|
|||||||
Thread executionThread = Interlocked.CompareExchange(ref _executingThread, null, _executingThread);
|
Thread executionThread = Interlocked.CompareExchange(ref _executingThread, null, _executingThread);
|
||||||
if (null != executionThread)
|
if (null != executionThread)
|
||||||
{
|
{
|
||||||
executionThread.Abort(); // "Cancel"
|
//executionThread.Abort(); // "Cancel"
|
||||||
success = true;
|
success = true;
|
||||||
signalComplete = true;
|
signalComplete = true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user