# 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");