diff options
Diffstat (limited to 'tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs')
-rw-r--r-- | tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs | 168 |
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); + } + } +} |