* Changed the misc. methods calling ThreadPool.UnsafeQueueUserWorkItem() to Util.FireAndForget()

* Changed Util.FireAndForget() to use any of five different methods set with async_call_method in the [Startup] section of OpenSim.ini. Look at the example config for possible values
This commit is contained in:
John Hurliman
2009-10-21 23:03:18 -07:00
parent 6492640e72
commit 32ccd5bb40
9 changed files with 79 additions and 36 deletions

View File

@@ -403,7 +403,7 @@ namespace OpenSim.Framework.Communications
/// In case, we are invoked asynchroneously this object will keep track of the state
/// </summary>
AsyncResult<Stream> ar = new AsyncResult<Stream>(callback, state);
ThreadPool.UnsafeQueueUserWorkItem(RequestHelper, ar);
Util.FireAndForget(RequestHelper, ar);
return ar;
}

View File

@@ -66,7 +66,7 @@ namespace OpenSim.Framework
for (int i = 0; i < threadCount; i++)
{
ThreadPool.UnsafeQueueUserWorkItem(
Util.FireAndForget(
delegate(object o)
{
int threadIndex = (int)o;
@@ -122,7 +122,7 @@ namespace OpenSim.Framework
for (int i = 0; i < threadCount; i++)
{
ThreadPool.UnsafeQueueUserWorkItem(
Util.FireAndForget(
delegate(object o)
{
int threadIndex = (int)o;
@@ -178,7 +178,7 @@ namespace OpenSim.Framework
for (int i = 0; i < threadCount; i++)
{
ThreadPool.UnsafeQueueUserWorkItem(
Util.FireAndForget(
delegate(object o)
{
int threadIndex = (int)o;

View File

@@ -50,6 +50,18 @@ using OpenMetaverse.StructuredData;
namespace OpenSim.Framework
{
/// <summary>
/// The method used by Util.FireAndForget for asynchronously firing events
/// </summary>
public enum FireAndForgetMethod
{
UnsafeQueueUserWorkItem,
QueueUserWorkItem,
BeginInvoke,
SmartThreadPool,
Thread,
}
/// <summary>
/// Miscellaneous utility functions
/// </summary>
@@ -70,7 +82,9 @@ namespace OpenSim.Framework
public static readonly Regex UUIDPattern
= new Regex("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$");
public static FireAndForgetMethod FireAndForgetMethod = FireAndForgetMethod.UnsafeQueueUserWorkItem;
/// <summary>
/// Linear interpolates B<->C using percent A
/// </summary>
@@ -1273,7 +1287,7 @@ namespace OpenSim.Framework
/// <summary>
/// Created to work around a limitation in Mono with nested delegates
/// </summary>
/*private class FireAndForgetWrapper
private class FireAndForgetWrapper
{
public void FireAndForget(System.Threading.WaitCallback callback)
{
@@ -1284,32 +1298,50 @@ namespace OpenSim.Framework
{
callback.BeginInvoke(obj, EndFireAndForget, callback);
}
}*/
private static void EndFireAndForget(IAsyncResult ar)
{
System.Threading.WaitCallback callback = (System.Threading.WaitCallback)ar.AsyncState;
try { callback.EndInvoke(ar); }
catch (Exception ex) { m_log.Error("[UTIL]: Asynchronous method threw an exception: " + ex.Message, ex); }
ar.AsyncWaitHandle.Close();
}
}
public static void FireAndForget(System.Threading.WaitCallback callback)
{
//FireAndForgetWrapper wrapper = Singleton.GetInstance<FireAndForgetWrapper>();
//wrapper.FireAndForget(callback);
System.Threading.ThreadPool.UnsafeQueueUserWorkItem(callback, null);
FireAndForget(callback, null);
}
public static void FireAndForget(System.Threading.WaitCallback callback, object obj)
{
//FireAndForgetWrapper wrapper = Singleton.GetInstance<FireAndForgetWrapper>();
//wrapper.FireAndForget(callback, obj);
System.Threading.ThreadPool.UnsafeQueueUserWorkItem(callback, obj);
switch (FireAndForgetMethod)
{
case FireAndForgetMethod.UnsafeQueueUserWorkItem:
System.Threading.ThreadPool.UnsafeQueueUserWorkItem(callback, obj);
break;
case FireAndForgetMethod.QueueUserWorkItem:
System.Threading.ThreadPool.QueueUserWorkItem(callback, obj);
break;
case FireAndForgetMethod.BeginInvoke:
FireAndForgetWrapper wrapper = Singleton.GetInstance<FireAndForgetWrapper>();
wrapper.FireAndForget(callback, obj);
break;
case FireAndForgetMethod.SmartThreadPool:
Amib.Threading.SmartThreadPool stp = Singleton.GetInstance<Amib.Threading.SmartThreadPool>();
stp.QueueWorkItem(delegate(object o) { callback(o); return null; }, obj);
break;
case FireAndForgetMethod.Thread:
System.Threading.Thread thread = new System.Threading.Thread(delegate(object o) { callback(o); });
thread.Start(obj);
break;
default:
throw new NotImplementedException();
}
}
/*private static void EndFireAndForget(IAsyncResult ar)
{
System.Threading.WaitCallback callback = (System.Threading.WaitCallback)ar.AsyncState;
try { callback.EndInvoke(ar); }
catch (Exception ex) { m_log.Error("[UTIL]: Asynchronous method threw an exception: " + ex.Message, ex); }
ar.AsyncWaitHandle.Close();
}*/
#endregion FireAndForget Threading Pattern
}
}