// -----------------------------------------------------------------------
//
// TODO: Update copyright text.
//
// -----------------------------------------------------------------------
using System.Threading.Tasks;
namespace Pithos.Core.Agents
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
///
/// TODO: Update summary.
///
public class AsyncAutoResetEvent
{
private readonly static Task Completed = TaskEx.FromResult(true);
private readonly Queue> _waits = new Queue>();
private bool _signaled;
public Task WaitAsync()
{
lock (_waits)
{
if (_signaled)
{
_signaled = false;
return Completed;
}
else
{
var tcs = new TaskCompletionSource();
_waits.Enqueue(tcs);
return tcs.Task;
}
}
}
public void Set()
{
TaskCompletionSource toRelease = null;
lock (_waits)
{
if (_waits.Count > 0)
toRelease = _waits.Dequeue();
else if (!_signaled)
_signaled = true;
}
if (toRelease != null)
toRelease.SetResult(true);
}
}
}