Statistics
| Branch: | Revision:

root / trunk / Pithos.Core / Agents / AsyncSemaphore.cs @ 23877270

History | View | Annotate | Download (1.8 kB)

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