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 | } |