Added option to set MaxStackSize of threads

This commit is contained in:
Ami Bar
2012-08-25 23:24:41 +03:00
parent 4af5ce990d
commit 1fff68dfea
3 changed files with 83 additions and 2 deletions
+42
View File
@@ -63,6 +63,48 @@ namespace SmartThreadPoolTests
int counter = ThreadContextState.Current.Counter; int counter = ThreadContextState.Current.Counter;
_termSuccess = (1111 == counter); _termSuccess = (1111 == counter);
} }
// Can't run this test, StackOverflowException crashes the application and can't be catched and ignored
//[Test]
public void NotTestThreadsMaxStackSize()
{
STPStartInfo stpStartInfo = new STPStartInfo()
{
MaxStackSize = 64 * 1024,
};
SmartThreadPool stp = new SmartThreadPool(stpStartInfo);
stp.Start();
IWorkItemResult<bool> wir = stp.QueueWorkItem(() => AllocateBufferOnStack(10 * 1024));
bool result = wir.GetResult();
Assert.IsTrue(result);
wir = stp.QueueWorkItem(() => AllocateBufferOnStack(1000 * 1024));
result = wir.GetResult();
Assert.IsFalse(result);
}
private static unsafe bool AllocateBufferOnStack(int size)
{
try
{
byte* p = stackalloc byte[size];
}
catch (StackOverflowException ex)
{
return false;
}
catch (Exception ex)
{
return false;
}
return true;
}
} }
internal class ThreadContextState internal class ThreadContextState
+22
View File
@@ -18,6 +18,7 @@ namespace Amib.Threading
private bool _areThreadsBackground = SmartThreadPool.DefaultAreThreadsBackground; private bool _areThreadsBackground = SmartThreadPool.DefaultAreThreadsBackground;
private bool _enableLocalPerformanceCounters; private bool _enableLocalPerformanceCounters;
private string _threadPoolName = SmartThreadPool.DefaultThreadPoolName; private string _threadPoolName = SmartThreadPool.DefaultThreadPoolName;
private int? _maxStackSize = SmartThreadPool.DefaultMaxStackSize;
public STPStartInfo() public STPStartInfo()
{ {
@@ -185,6 +186,27 @@ namespace Amib.Threading
_apartmentState = value; _apartmentState = value;
} }
} }
#if !(_SILVERLIGHT) && !(WINDOWS_PHONE)
/// <summary>
/// Get/Set the max stack size of threads in the thread pool
/// </summary>
public int? MaxStackSize
{
get { return _maxStackSize; }
set
{
ThrowIfReadOnly();
if (value.HasValue && value.Value < 0)
{
throw new ArgumentOutOfRangeException("value", "Value must be greater than 0.");
}
_maxStackSize = value;
}
}
#endif
#endif #endif
} }
} }
+19 -2
View File
@@ -89,6 +89,11 @@
// - Added IsBackground option to threads // - Added IsBackground option to threads
// - Added ApartmentState to threads // - Added ApartmentState to threads
// - Fixed thread creation when queuing many work items at the same time. // - Fixed thread creation when queuing many work items at the same time.
//
// 24 August 2012 - Changes:
// - Enabled cancel abort after cancel. See: http://smartthreadpool.codeplex.com/discussions/345937 by alecswan
// - Added option to set MaxStackSize of threads
#endregion #endregion
using System; using System;
@@ -180,6 +185,11 @@ namespace Amib.Threading
/// </summary> /// </summary>
public const string DefaultThreadPoolName = "SmartThreadPool"; public const string DefaultThreadPoolName = "SmartThreadPool";
/// <summary>
/// The default Max Stack Size. (SmartThreadPool)
/// </summary>
public static readonly int? DefaultMaxStackSize = null;
/// <summary> /// <summary>
/// The default fill state with params. (false) /// The default fill state with params. (false)
/// It is relevant only to QueueWorkItem of Action&lt;...&gt;/Func&lt;...&gt; /// It is relevant only to QueueWorkItem of Action&lt;...&gt;/Func&lt;...&gt;
@@ -656,9 +666,16 @@ namespace Amib.Threading
return; return;
} }
// Create a new thread // Create a new thread
Thread workerThread = new Thread(ProcessQueuedItems);
#if (_SILVERLIGHT) || (WINDOWS_PHONE)
Thread workerThread = new Thread(ProcessQueuedItems);
#else
Thread workerThread =
_stpStartInfo.MaxStackSize.HasValue
? new Thread(ProcessQueuedItems, _stpStartInfo.MaxStackSize.Value)
: new Thread(ProcessQueuedItems);
#endif
// Configure the new thread and start it // Configure the new thread and start it
workerThread.Name = "STP " + Name + " Thread #" + _threadCounter; workerThread.Name = "STP " + Name + " Thread #" + _threadCounter;
workerThread.IsBackground = _stpStartInfo.AreThreadsBackground; workerThread.IsBackground = _stpStartInfo.AreThreadsBackground;