in MPI/Serialization.cs [456:506]
public void WaitAll(Communicator comm)
{
RequestList requests = new RequestList();
Dictionary<Request, EventWaitHandle> waitHandles = new Dictionary<Request, EventWaitHandle>();
Dictionary<Request, string> requestTags = new Dictionary<Request, string>();
DateTime startTime = DateTime.UtcNow;
int nextMinute = 1;
var workItems = comm.Serialization.WorkItems;
while (pendingCount > 0 || workItems.Count > 0 || requests.Count > 0)
{
RequestGenerator workItem;
if (workItems.TryDequeue(out workItem))
{
var request = workItem.generator();
requests.Add(request);
waitHandles.Add(request, workItem.waitHandle);
requestTags.Add(request, workItem.Tag);
}
else
{
var request = requests.TestAny();
if (request != null)
{
waitHandles[request].Set();
waitHandles.Remove(request);
requestTags.Remove(request);
}
}
var elapsed = DateTime.UtcNow - startTime;
if (elapsed.TotalMinutes > nextMinute)
{
StringBuilder sb = new StringBuilder();
if (requestTags.Count > 0)
{
sb.Append(": ");
bool firstTime = true;
foreach (var tag in requestTags.Values)
{
if (!firstTime)
sb.Append(",");
sb.Append(tag);
firstTime = false;
}
}
comm.Serialization.WaitLogger?.Invoke($"Waiting on {pendingCount} pending tasks, {workItems.Count} work items, {requests.Count} requests{sb.ToString()}");
nextMinute++;
}
}
if (waitHandles.Count != 0)
throw new Exception("waitHandles.Count != 0");
}