summaryrefslogtreecommitdiff
path: root/tests/src/baseservices/threading/regressions/beta2/437017.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/baseservices/threading/regressions/beta2/437017.cs')
-rw-r--r--tests/src/baseservices/threading/regressions/beta2/437017.cs125
1 files changed, 125 insertions, 0 deletions
diff --git a/tests/src/baseservices/threading/regressions/beta2/437017.cs b/tests/src/baseservices/threading/regressions/beta2/437017.cs
new file mode 100644
index 0000000000..284a5ae8df
--- /dev/null
+++ b/tests/src/baseservices/threading/regressions/beta2/437017.cs
@@ -0,0 +1,125 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Threading;
+
+class Test
+{
+ static bool _fTestFailed = false;
+ static bool _fTestDone = false;
+ static ManualResetEvent _mre;
+ static AutoResetEvent _are = new AutoResetEvent(false);
+
+ public static int Main(string[] args)
+ {
+ Thread th = new Thread(new ThreadStart(Thread2));
+ th.Start();
+ Thread th2 = new Thread(new ThreadStart(Thread3));
+ th2.Start();
+ System.Diagnostics.Stopwatch myTimer = new System.Diagnostics.Stopwatch();
+ myTimer.Start();
+
+ int i = 0;
+ while (!_fTestFailed && myTimer.Elapsed.Minutes < 5 && i < 25000)
+ {
+ i++;
+ ManualResetEvent mre = new ManualResetEvent(false);
+ _mre = new ManualResetEvent(false);
+ RegisteredWaitHandle rwh = ThreadPool.RegisterWaitForSingleObject(mre, new WaitOrTimerCallback(callback), null, -1, false);
+ _are.Set();
+
+ bool bUnregisterSucceeded = false; //Used to improve speed of the test when Unregister has failed
+ try
+ {
+ rwh.Unregister(_mre);
+ bUnregisterSucceeded = true;
+ }
+ catch (ObjectDisposedException)
+ {
+ }
+
+ if (bUnregisterSucceeded)
+ {
+ try
+ {
+ if (_mre.WaitOne(0))
+ {
+ Console.Write("@");
+ }
+ }
+ catch (ObjectDisposedException)
+ {
+ }
+ }
+
+ if (i % 100 == 0) Console.WriteLine(i);
+ }
+ _fTestDone = true;
+ _are.Set();
+ th.Join();
+ th2.Join();
+
+ if (!_fTestFailed)
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+
+ Console.WriteLine("Test Failed");
+ return 101;
+
+ }
+
+ static void callback(object state, bool fTimedOut)
+ {
+ Console.Write("!");
+ _fTestFailed = true;
+ }
+
+ public static void Thread3()
+ {
+ while (true & !_fTestDone)
+ {
+ _are.WaitOne();
+ _mre.Dispose();
+ }
+ }
+
+ public static void Thread2()
+ {
+ while (true & !_fTestDone)
+ {
+ Console.Write("#");
+ AutoResetEvent are;
+ using (are = new AutoResetEvent(false))
+ {
+ if (are.WaitOne(0))
+ {
+ Console.WriteLine("ARE Signaled!");
+ _fTestFailed = true;
+ }
+ }
+
+ using (are = new AutoResetEvent(false))
+ {
+ if (are.WaitOne(0))
+ {
+ Console.WriteLine("ARE Signaled!");
+ _fTestFailed = true;
+ }
+ }
+
+ using(are = new AutoResetEvent(false))
+ {
+ if (are.WaitOne(0))
+ {
+ Console.WriteLine("ARE Signaled!");
+ _fTestFailed = true;
+ }
+ }
+ }
+ }
+}
+