* Switched all operations on the list of clients that could be either sync or async to use Scene.ForEachClient() instead of referencing ClientManager directly

* Added a new [Startup] config option called use_async_when_possible to signal how to run operations that could be either sync or async
* Changed Scene.ForEachClient to respect use_async_when_possible
* Fixing a potential deadlock in Parallel.ForEach by locking on a temporary object instead of the enumerator (which may be shared across multiple invocations on ForEach). Thank you diva
This commit is contained in:
John Hurliman
2009-10-26 16:33:04 -07:00
parent 119cf80e13
commit 4847e62e9f
7 changed files with 44 additions and 28 deletions

View File

@@ -118,6 +118,7 @@ namespace OpenSim.Framework
int counter = threadCount;
AutoResetEvent threadFinishEvent = new AutoResetEvent(false);
IEnumerator<T> enumerator = enumerable.GetEnumerator();
object syncRoot = new object();
Exception exception = null;
for (int i = 0; i < threadCount; i++)
@@ -131,7 +132,7 @@ namespace OpenSim.Framework
{
T entry;
lock (enumerator)
lock (syncRoot)
{
if (!enumerator.MoveNext())
break;