add option for Fireandforget not timeout (our access to main smartThreadPool)
parent
f33a871d61
commit
5ce15566ac
|
@ -182,9 +182,9 @@ namespace OpenSim.Framework.Monitoring
|
||||||
/// <param name="callback"></param>
|
/// <param name="callback"></param>
|
||||||
/// <param name="obj"></param>
|
/// <param name="obj"></param>
|
||||||
/// <param name="name">The name of the job. This is used in monitoring and debugging.</param>
|
/// <param name="name">The name of the job. This is used in monitoring and debugging.</param>
|
||||||
public static void RunInThreadPool(System.Threading.WaitCallback callback, object obj, string name)
|
public static void RunInThreadPool(System.Threading.WaitCallback callback, object obj, string name, bool timeout = true)
|
||||||
{
|
{
|
||||||
Util.FireAndForget(callback, obj, name);
|
Util.FireAndForget(callback, obj, name, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -231,10 +231,8 @@ namespace OpenSim.Framework.Monitoring
|
||||||
JobEngine.QueueJob(name, () => callback(obj));
|
JobEngine.QueueJob(name, () => callback(obj));
|
||||||
else if (canRunInThisThread)
|
else if (canRunInThisThread)
|
||||||
callback(obj);
|
callback(obj);
|
||||||
else if (mustNotTimeout)
|
|
||||||
RunInThread(callback, obj, name, log);
|
|
||||||
else
|
else
|
||||||
Util.FireAndForget(callback, obj, name);
|
Util.FireAndForget(callback, obj, name, !mustNotTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void HandleControlCommand(string module, string[] args)
|
private static void HandleControlCommand(string module, string[] args)
|
||||||
|
|
|
@ -2492,8 +2492,9 @@ namespace OpenSim.Framework
|
||||||
public bool Running { get; set; }
|
public bool Running { get; set; }
|
||||||
public bool Aborted { get; set; }
|
public bool Aborted { get; set; }
|
||||||
private int started;
|
private int started;
|
||||||
|
public bool DoTimeout;
|
||||||
|
|
||||||
public ThreadInfo(long threadFuncNum, string context)
|
public ThreadInfo(long threadFuncNum, string context, bool dotimeout = true)
|
||||||
{
|
{
|
||||||
ThreadFuncNum = threadFuncNum;
|
ThreadFuncNum = threadFuncNum;
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
@ -2501,6 +2502,7 @@ namespace OpenSim.Framework
|
||||||
Thread = null;
|
Thread = null;
|
||||||
Running = false;
|
Running = false;
|
||||||
Aborted = false;
|
Aborted = false;
|
||||||
|
DoTimeout = dotimeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Started()
|
public void Started()
|
||||||
|
@ -2571,7 +2573,7 @@ namespace OpenSim.Framework
|
||||||
foreach (KeyValuePair<long, ThreadInfo> entry in activeThreads)
|
foreach (KeyValuePair<long, ThreadInfo> entry in activeThreads)
|
||||||
{
|
{
|
||||||
ThreadInfo t = entry.Value;
|
ThreadInfo t = entry.Value;
|
||||||
if (t.Running && !t.Aborted && (t.Elapsed() >= THREAD_TIMEOUT))
|
if (t.DoTimeout && t.Running && !t.Aborted && (t.Elapsed() >= THREAD_TIMEOUT))
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("Timeout in threadfunc {0} ({1}) {2}", t.ThreadFuncNum, t.Thread.Name, t.GetStackTrace());
|
m_log.WarnFormat("Timeout in threadfunc {0} ({1}) {2}", t.ThreadFuncNum, t.Thread.Name, t.GetStackTrace());
|
||||||
t.Abort();
|
t.Abort();
|
||||||
|
@ -2612,7 +2614,7 @@ namespace OpenSim.Framework
|
||||||
FireAndForget(callback, obj, null);
|
FireAndForget(callback, obj, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void FireAndForget(System.Threading.WaitCallback callback, object obj, string context)
|
public static void FireAndForget(System.Threading.WaitCallback callback, object obj, string context, bool dotimeout = true)
|
||||||
{
|
{
|
||||||
Interlocked.Increment(ref numTotalThreadFuncsCalled);
|
Interlocked.Increment(ref numTotalThreadFuncsCalled);
|
||||||
|
|
||||||
|
@ -2634,7 +2636,7 @@ namespace OpenSim.Framework
|
||||||
bool loggingEnabled = LogThreadPool > 0;
|
bool loggingEnabled = LogThreadPool > 0;
|
||||||
|
|
||||||
long threadFuncNum = Interlocked.Increment(ref nextThreadFuncNum);
|
long threadFuncNum = Interlocked.Increment(ref nextThreadFuncNum);
|
||||||
ThreadInfo threadInfo = new ThreadInfo(threadFuncNum, context);
|
ThreadInfo threadInfo = new ThreadInfo(threadFuncNum, context, dotimeout);
|
||||||
|
|
||||||
if (FireAndForgetMethod == FireAndForgetMethod.RegressionTest)
|
if (FireAndForgetMethod == FireAndForgetMethod.RegressionTest)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue