# HG changeset patch
# User cin
# Date 1422497371 -10800
# Node ID 6241bff0cd64e284346ea70c208272528be53d54
# Parent d86da8d2d4c3220c4663461b78bb9115af5f6bc0
Added Signal class a lightweight alternative to ManualResetEvent
diff -r d86da8d2d4c3 -r 6241bff0cd64 Implab/Implab.csproj
--- a/Implab/Implab.csproj Tue Jan 27 18:18:29 2015 +0300
+++ b/Implab/Implab.csproj Thu Jan 29 05:09:31 2015 +0300
@@ -155,6 +155,7 @@
+
diff -r d86da8d2d4c3 -r 6241bff0cd64 Implab/Parallels/AsyncQueue.cs
--- a/Implab/Parallels/AsyncQueue.cs Tue Jan 27 18:18:29 2015 +0300
+++ b/Implab/Parallels/AsyncQueue.cs Thu Jan 29 05:09:31 2015 +0300
@@ -454,7 +454,7 @@
} while(true);
}
- T[] ReadChunks(Chunk chunk, object last) {
+ static T[] ReadChunks(Chunk chunk, object last) {
var result = new List();
var buffer = new T[DEFAULT_CHUNK_SIZE];
int actual;
diff -r d86da8d2d4c3 -r 6241bff0cd64 Implab/Parallels/Signal.cs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Implab/Parallels/Signal.cs Thu Jan 29 05:09:31 2015 +0300
@@ -0,0 +1,31 @@
+using System;
+using System.Threading;
+
+namespace Implab.Parallels {
+ ///
+ /// Implements simple signalling logic using .
+ ///
+ public class Signal {
+ readonly object m_lock = new object();
+ bool m_state;
+
+ public void Set() {
+ lock(m_lock) {
+ m_state = true;
+ Monitor.PulseAll(m_lock);
+ }
+ }
+
+ public void Wait() {
+ lock (m_lock)
+ if (!m_state)
+ Monitor.Wait(m_lock);
+ }
+
+ public bool Wait(int timeout) {
+ lock (m_lock)
+ return m_state || Monitor.Wait(m_lock, timeout);
+ }
+ }
+}
+
diff -r d86da8d2d4c3 -r 6241bff0cd64 Implab/Safe.cs
--- a/Implab/Safe.cs Tue Jan 27 18:18:29 2015 +0300
+++ b/Implab/Safe.cs Thu Jan 29 05:09:31 2015 +0300
@@ -36,13 +36,26 @@
throw new ArgumentOutOfRangeException(paramName);
}
- public static void Dispose(params IDisposable[] objects)
- {
- foreach(var d in objects)
+ public static void Dispose(params IDisposable[] objects) {
+ foreach (var d in objects)
if (d != null)
d.Dispose();
}
+ public static void Dispose(params object[] objects) {
+ foreach (var obj in objects) {
+ var d = obj as IDisposable;
+ if (d != null)
+ d.Dispose();
+ }
+ }
+
+ public static void Dispose(object obj) {
+ var d = obj as IDisposable;
+ if (d != null)
+ d.Dispose();
+ }
+
[DebuggerStepThrough]
public static IPromise InvokePromise(Func action) {
ArgumentNotNull(action, "action");