Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / Agents / AsyncAutoResetEvent.cs @ 79f92570

History | View | Annotate | Download (1.6 kB)

1 79f92570 Panagiotis Kanavos
// -----------------------------------------------------------------------
2 79f92570 Panagiotis Kanavos
// <copyright file="AsyncAutoResetEvent.cs" company="Microsoft">
3 79f92570 Panagiotis Kanavos
// TODO: Update copyright text.
4 79f92570 Panagiotis Kanavos
// </copyright>
5 79f92570 Panagiotis Kanavos
// -----------------------------------------------------------------------
6 79f92570 Panagiotis Kanavos
7 79f92570 Panagiotis Kanavos
using System.Threading.Tasks;
8 79f92570 Panagiotis Kanavos
9 79f92570 Panagiotis Kanavos
namespace Pithos.Core.Agents
10 79f92570 Panagiotis Kanavos
{
11 79f92570 Panagiotis Kanavos
    using System;
12 79f92570 Panagiotis Kanavos
    using System.Collections.Generic;
13 79f92570 Panagiotis Kanavos
    using System.Linq;
14 79f92570 Panagiotis Kanavos
    using System.Text;
15 79f92570 Panagiotis Kanavos
16 79f92570 Panagiotis Kanavos
    /// <summary>
17 79f92570 Panagiotis Kanavos
    /// TODO: Update summary.
18 79f92570 Panagiotis Kanavos
    /// </summary>
19 79f92570 Panagiotis Kanavos
    public class AsyncAutoResetEvent
20 79f92570 Panagiotis Kanavos
    {
21 79f92570 Panagiotis Kanavos
        private readonly static Task Completed = TaskEx.FromResult(true);
22 79f92570 Panagiotis Kanavos
        private readonly Queue<TaskCompletionSource<bool>> _waits = new Queue<TaskCompletionSource<bool>>();
23 79f92570 Panagiotis Kanavos
        private bool _signaled;
24 79f92570 Panagiotis Kanavos
25 79f92570 Panagiotis Kanavos
        public Task WaitAsync()
26 79f92570 Panagiotis Kanavos
        {
27 79f92570 Panagiotis Kanavos
            lock (_waits)
28 79f92570 Panagiotis Kanavos
            {
29 79f92570 Panagiotis Kanavos
                if (_signaled)
30 79f92570 Panagiotis Kanavos
                {
31 79f92570 Panagiotis Kanavos
                    _signaled = false;
32 79f92570 Panagiotis Kanavos
                    return Completed;
33 79f92570 Panagiotis Kanavos
                }
34 79f92570 Panagiotis Kanavos
                else
35 79f92570 Panagiotis Kanavos
                {
36 79f92570 Panagiotis Kanavos
                    var tcs = new TaskCompletionSource<bool>();
37 79f92570 Panagiotis Kanavos
                    _waits.Enqueue(tcs);
38 79f92570 Panagiotis Kanavos
                    return tcs.Task;
39 79f92570 Panagiotis Kanavos
                }
40 79f92570 Panagiotis Kanavos
            }
41 79f92570 Panagiotis Kanavos
        }
42 79f92570 Panagiotis Kanavos
43 79f92570 Panagiotis Kanavos
        public void Set()
44 79f92570 Panagiotis Kanavos
        {
45 79f92570 Panagiotis Kanavos
            TaskCompletionSource<bool> toRelease = null;
46 79f92570 Panagiotis Kanavos
            lock (_waits)
47 79f92570 Panagiotis Kanavos
            {
48 79f92570 Panagiotis Kanavos
                if (_waits.Count > 0)
49 79f92570 Panagiotis Kanavos
                    toRelease = _waits.Dequeue();
50 79f92570 Panagiotis Kanavos
                else if (!_signaled)
51 79f92570 Panagiotis Kanavos
                    _signaled = true;
52 79f92570 Panagiotis Kanavos
            }
53 79f92570 Panagiotis Kanavos
            if (toRelease != null)
54 79f92570 Panagiotis Kanavos
                toRelease.SetResult(true);
55 79f92570 Panagiotis Kanavos
        }
56 79f92570 Panagiotis Kanavos
57 79f92570 Panagiotis Kanavos
    }
58 79f92570 Panagiotis Kanavos
}