summaryrefslogtreecommitdiff
path: root/tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs')
-rw-r--r--tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs168
1 files changed, 96 insertions, 72 deletions
diff --git a/tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs b/tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs
index 716fbbc354..41e98931fd 100644
--- a/tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs
+++ b/tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs
@@ -3,87 +3,111 @@
// See the LICENSE file in the project root for more information.
using System;
using System.Threading;
+
delegate void MonitorDelegate(object monitor);
delegate void MonitorDelegateTS(object monitor,int timeout);
-
+
class TestHelper
{
- private int m_iSharedData;
- private int m_iRequestedEntries;
- public ManualResetEvent m_Event;
- public bool m_bError;
+ private int m_iSharedData;
+ private int m_iRequestedEntries;
+ public ManualResetEvent m_Event;
+ public bool m_bError;
+ private Random m_rng = new Random(0);
- public bool Error
- {
- set
- {
- lock(typeof(TestHelper))
- {
- m_bError = value;
- }
- }
- get
- {
- lock(typeof(TestHelper))
- {
- return m_bError;
- }
- }
- }
+ public bool Error
+ {
+ set
+ {
+ lock(typeof(TestHelper))
+ {
+ m_bError = value;
+ }
+ }
+ get
+ {
+ lock(typeof(TestHelper))
+ {
+ return m_bError;
+ }
+ }
+ }
- public TestHelper(int num)
- {
- m_Event = new ManualResetEvent(false);
- m_iSharedData = 0;
- m_iRequestedEntries = num;
- m_bError = false;
- }
-
- public void DoWork()
- {
- int snapshot = m_iSharedData;
- Thread.Sleep(5);
+ public TestHelper(int num)
+ {
+ m_Event = new ManualResetEvent(false);
+ m_iSharedData = 0;
+ m_iRequestedEntries = num;
+ m_bError = false;
+ }
+
+ public void DoWork()
+ {
+ int snapshot = m_iSharedData;
+ Delayer.Delay(Delayer.RandomShortDelay(m_rng));
#if (DEBUG)
- Console.WriteLine("Entering Monitor: " + m_iSharedData);
+ Console.WriteLine("Entering Monitor: " + m_iSharedData);
#endif
- m_iSharedData++;
- Thread.Sleep(1);
- if(m_iSharedData != snapshot + 1)
- {
- Error = true;
- Console.WriteLine("Failure!!!");
- }
+ m_iSharedData++;
+ Delayer.Delay(Delayer.RandomShortDelay(m_rng));
+ if(m_iSharedData != snapshot + 1)
+ {
+ Error = true;
+ Console.WriteLine("Failure!!!");
+ }
#if (DEBUG)
- Console.WriteLine("Leaving Monitor: " + m_iSharedData);
+ Console.WriteLine("Leaving Monitor: " + m_iSharedData);
#endif
- if(m_iSharedData == m_iRequestedEntries)
- m_Event.Set();
- }
- public void Consumer(object monitor)
- {
- lock(monitor)
- {
- DoWork();
- }
- }
- public void ConsumerTryEnter(object monitor,int timeout)
- {
- try
- {
- bool tookLock = false;
-
- Monitor.TryEnter(monitor,timeout, ref tookLock);
+ if(m_iSharedData == m_iRequestedEntries)
+ m_Event.Set();
+ }
+ public void Consumer(object monitor)
+ {
+ lock(monitor)
+ {
+ DoWork();
+ }
+ }
+ public void ConsumerTryEnter(object monitor,int timeout)
+ {
+ try
+ {
+ bool tookLock = false;
+
+ Monitor.TryEnter(monitor,timeout, ref tookLock);
+
+ while(!tookLock) {
+ Thread.Sleep(0);
+ Monitor.TryEnter(monitor,timeout, ref tookLock);
+ }
+
+ DoWork();
+ }
+ finally
+ {
+ Monitor.Exit(monitor);
+ }
+ }
+
+ private static class Delayer
+ {
+ private static uint[] s_delayValues = new uint[32];
+
+ public static uint RandomShortDelay(Random rng) => (uint)rng.Next(4, 10);
+ public static uint RandomMediumDelay(Random rng) => (uint)rng.Next(10, 15);
+ public static uint RandomLongDelay(Random rng) => (uint)rng.Next(15, 20);
- while(!tookLock) {
- Thread.Sleep(0);
- Monitor.TryEnter(monitor,timeout, ref tookLock);
- }
+ public static void Delay(uint n)
+ {
+ Thread.Sleep(0);
+ s_delayValues[16] += Fib(n);
+ }
- DoWork();
- }
- finally
- {
- Monitor.Exit(monitor);
- }
- }
-} \ No newline at end of file
+ private static uint Fib(uint n)
+ {
+ if (n <= 1)
+ return n;
+ return Fib(n - 2) + Fib(n - 1);
+ }
+ }
+}