+2006-03-19 Robert Jordan <robertj@gmx.net>
+
+ * Timer.cs: Fix race condition of the wait handle object.
+ Fixes bug #77847.
+
2005-11-16 Sebastien Pouliot <sebastien@ximian.com>
* TimersDescriptionAttribute.cs: Revert Description property fix
double interval;
ISynchronizeInvoke so;
ManualResetEvent wait;
+ Thread thread;
+ object locker = new object ();
[Category("Behavior")]
[TimersDescription("Occurs when the Interval has elapsed.")]
enabled = value;
if (value) {
- Thread t = new Thread (new ThreadStart (StartTimer));
- t.IsBackground = true;
- t.Start ();
+ wait = new ManualResetEvent (false);
+ thread = new Thread (new ThreadStart (StartTimer));
+ thread.IsBackground = true;
+ thread.Start ();
} else {
StopTimer ();
}
void StartTimer ()
{
- wait = new ManualResetEvent (false);
-
WaitCallback wc = new WaitCallback (Callback);
while (enabled && wait.WaitOne ((int) interval, false) == false) {
if (autoReset == false)
ThreadPool.QueueUserWorkItem (wc, this);
}
-
+
wc = null;
- ((IDisposable) wait).Dispose ();
- wait = null;
+
+ lock (locker) {
+ ((IDisposable) wait).Dispose ();
+ wait = null;
+ }
}
void StopTimer ()
{
- if (wait != null)
- wait.Set ();
+ lock (locker) {
+ if (wait != null)
+ wait.Set ();
+ }
+
+ // the sleep speeds up the join under linux
+ Thread.Sleep (0);
+ thread.Join ();
}
}
}