diff Implab/Parallels/Signal.cs @ 128:6241bff0cd64 v2

Added Signal class a lightweight alternative to ManualResetEvent
author cin
date Thu, 29 Jan 2015 05:09:31 +0300
parents
children 471f596b2603
line wrap: on
line diff
--- /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 {
+    /// <summary>
+    /// Implements simple signalling logic using <see cref="Monitor.PulseAll(object)"/>.
+    /// </summary>
+    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);
+        }
+    }
+}
+