##// END OF EJS Templates
Added Signal class a lightweight alternative to ManualResetEvent
cin -
r128:6241bff0cd64 v2
parent child
Show More
@@ -0,0 +1,31
1 using System;
2 using System.Threading;
3
4 namespace Implab.Parallels {
5 /// <summary>
6 /// Implements simple signalling logic using <see cref="Monitor.PulseAll(object)"/>.
7 /// </summary>
8 public class Signal {
9 readonly object m_lock = new object();
10 bool m_state;
11
12 public void Set() {
13 lock(m_lock) {
14 m_state = true;
15 Monitor.PulseAll(m_lock);
16 }
17 }
18
19 public void Wait() {
20 lock (m_lock)
21 if (!m_state)
22 Monitor.Wait(m_lock);
23 }
24
25 public bool Wait(int timeout) {
26 lock (m_lock)
27 return m_state || Monitor.Wait(m_lock, timeout);
28 }
29 }
30 }
31
@@ -155,6 +155,7
155 <Compile Include="AbstractPromise.cs" />
155 <Compile Include="AbstractPromise.cs" />
156 <Compile Include="Promise.cs" />
156 <Compile Include="Promise.cs" />
157 <Compile Include="PromiseTransientException.cs" />
157 <Compile Include="PromiseTransientException.cs" />
158 <Compile Include="Parallels\Signal.cs" />
158 </ItemGroup>
159 </ItemGroup>
159 <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
160 <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
160 <ItemGroup />
161 <ItemGroup />
@@ -454,7 +454,7 namespace Implab.Parallels {
454 } while(true);
454 } while(true);
455 }
455 }
456
456
457 T[] ReadChunks(Chunk chunk, object last) {
457 static T[] ReadChunks(Chunk chunk, object last) {
458 var result = new List<T>();
458 var result = new List<T>();
459 var buffer = new T[DEFAULT_CHUNK_SIZE];
459 var buffer = new T[DEFAULT_CHUNK_SIZE];
460 int actual;
460 int actual;
@@ -36,13 +36,26 namespace Implab
36 throw new ArgumentOutOfRangeException(paramName);
36 throw new ArgumentOutOfRangeException(paramName);
37 }
37 }
38
38
39 public static void Dispose(params IDisposable[] objects)
39 public static void Dispose(params IDisposable[] objects) {
40 {
40 foreach (var d in objects)
41 foreach(var d in objects)
42 if (d != null)
41 if (d != null)
43 d.Dispose();
42 d.Dispose();
44 }
43 }
45
44
45 public static void Dispose(params object[] objects) {
46 foreach (var obj in objects) {
47 var d = obj as IDisposable;
48 if (d != null)
49 d.Dispose();
50 }
51 }
52
53 public static void Dispose(object obj) {
54 var d = obj as IDisposable;
55 if (d != null)
56 d.Dispose();
57 }
58
46 [DebuggerStepThrough]
59 [DebuggerStepThrough]
47 public static IPromise<T> InvokePromise<T>(Func<T> action) {
60 public static IPromise<T> InvokePromise<T>(Func<T> action) {
48 ArgumentNotNull(action, "action");
61 ArgumentNotNull(action, "action");
General Comments 0
You need to be logged in to leave comments. Login now