Added header to all files. Closes #2064
[pithos-ms-client] / trunk / Pithos.Core / Agents / AsyncManualResetEvent.cs
1 #region\r
2 /* -----------------------------------------------------------------------\r
3  * <copyright file="AsyncManualResetEvent.cs" company="GRNet">\r
4  * \r
5  * Copyright 2011-2012 GRNET S.A. All rights reserved.\r
6  *\r
7  * Redistribution and use in source and binary forms, with or\r
8  * without modification, are permitted provided that the following\r
9  * conditions are met:\r
10  *\r
11  *   1. Redistributions of source code must retain the above\r
12  *      copyright notice, this list of conditions and the following\r
13  *      disclaimer.\r
14  *\r
15  *   2. Redistributions in binary form must reproduce the above\r
16  *      copyright notice, this list of conditions and the following\r
17  *      disclaimer in the documentation and/or other materials\r
18  *      provided with the distribution.\r
19  *\r
20  *\r
21  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS\r
22  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
24  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR\r
25  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\r
28  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\r
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
32  * POSSIBILITY OF SUCH DAMAGE.\r
33  *\r
34  * The views and conclusions contained in the software and\r
35  * documentation are those of the authors and should not be\r
36  * interpreted as representing official policies, either expressed\r
37  * or implied, of GRNET S.A.\r
38  * </copyright>\r
39  * -----------------------------------------------------------------------\r
40  */\r
41 #endregion\r
42 using System.Threading;\r
43 using System.Threading.Tasks;\r
44 \r
45 namespace Pithos.Core.Agents\r
46 {\r
47     using System;\r
48     using System.Collections.Generic;\r
49     using System.Linq;\r
50     using System.Text;\r
51 \r
52     /// <summary>\r
53     /// TODO: Update summary.\r
54     /// </summary>\r
55     public class AsyncManualResetEvent\r
56     {\r
57         private volatile TaskCompletionSource<bool> _tcs;\r
58 \r
59         public AsyncManualResetEvent()\r
60         {\r
61             _tcs = new TaskCompletionSource<bool>();\r
62         }\r
63 \r
64         public AsyncManualResetEvent(bool signalled)\r
65         {            \r
66             _tcs = new TaskCompletionSource<bool>();\r
67             if (signalled)\r
68                 _tcs.SetResult(true);\r
69         }\r
70         public Task WaitAsync() { return _tcs.Task; }\r
71 \r
72         public void Wait()\r
73         {            \r
74             _tcs.Task.Wait();\r
75         }\r
76 \r
77         public void Set()\r
78         {\r
79             var tcs = _tcs;\r
80             Task.Factory.StartNew(s => ((TaskCompletionSource<bool>)s).TrySetResult(true),\r
81                 tcs, CancellationToken.None, TaskCreationOptions.PreferFairness, TaskScheduler.Default);\r
82             tcs.Task.Wait(); \r
83         }\r
84 \r
85         public void Reset()\r
86         {\r
87             while (true)\r
88             {\r
89                 var tcs = _tcs;\r
90                 if (!tcs.Task.IsCompleted ||\r
91                     Interlocked.CompareExchange(ref _tcs, new TaskCompletionSource<bool>(), tcs) == tcs)\r
92                     return;\r
93             }\r
94         }\r
95     }\r
96 }\r