diff options
Diffstat (limited to 'tests/src/baseservices/threading/regressions/beta2/437017.cs')
-rw-r--r-- | tests/src/baseservices/threading/regressions/beta2/437017.cs | 125 |
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; + } + } + } + } +} + |