summaryrefslogtreecommitdiff
path: root/tests/src/baseservices/threading/generics/Monitor/EnterExit12.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/baseservices/threading/generics/Monitor/EnterExit12.cs')
-rw-r--r--tests/src/baseservices/threading/generics/Monitor/EnterExit12.cs179
1 files changed, 179 insertions, 0 deletions
diff --git a/tests/src/baseservices/threading/generics/Monitor/EnterExit12.cs b/tests/src/baseservices/threading/generics/Monitor/EnterExit12.cs
new file mode 100644
index 0000000000..b868cd4429
--- /dev/null
+++ b/tests/src/baseservices/threading/generics/Monitor/EnterExit12.cs
@@ -0,0 +1,179 @@
+// 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;
+
+
+public struct ValX1<T> {}
+public class RefX1<T> {}
+
+class Gen<T>
+{
+ public static object staticLock;
+
+ public static void EnterExitTest<U>()
+ {
+
+ Gen<T>.staticLock = new object();
+ Gen<U>.staticLock = new object();
+
+ object monitorT = Gen<T>.staticLock;
+ object monitorU = Gen<U>.staticLock;
+
+ if(monitorU.Equals(monitorT))
+ throw new Exception("Invalid use of test case, T must not be equal to U - POSSIBLE TYPE SYSTEM BUG");
+
+ TestHelper myHelper = new TestHelper(Test.nThreads);
+ TestHelper myHelper2 = new TestHelper(Test.nThreads);
+ WaitHandle[] myWaiter = new WaitHandle[2];
+ myWaiter[0] = myHelper.m_Event;
+ myWaiter[1] = myHelper2.m_Event;
+ // for(int i=0;i<Test.nThreads;i++)
+ // {
+ // new MonitorDelegate(myHelper.Consumer).BeginInvoke(monitorT,null,null);
+ // new MonitorDelegate(myHelper2.Consumer).BeginInvoke(monitorU,null,null);
+ // }
+
+ for(int i=0; i<Test.nThreads; i++)
+ {
+ ThreadPool.QueueUserWorkItem(state =>
+ {
+ myHelper.Consumer(monitorT);
+ });
+
+ ThreadPool.QueueUserWorkItem(state =>
+ {
+ myHelper2.Consumer(monitorU);
+ });
+ }
+
+ for(int i=0;i<6;i++)
+ {
+ if(WaitHandle.WaitAll(myWaiter,10000))//,true))
+ break;
+ if(myHelper.Error == true || myHelper2.Error == true)
+ break;
+ }
+ Test.Eval(!(myHelper.Error && myHelper2.Error));
+ }
+
+
+
+}
+
+public class Test
+{
+ public static int nThreads = 50;
+ public static int counter = 0;
+ public static int Xcounter = 0;
+ public static bool result = true;
+ public static void Eval(bool exp)
+ {
+ counter++;
+ if (!exp)
+ {
+ result = exp;
+ Console.WriteLine("Test Failed at location: " + counter);
+ }
+
+ }
+
+ public static int Main()
+ {
+ Gen<double>.EnterExitTest<int>();
+ Gen<string>.EnterExitTest<int>();
+ Gen<object>.EnterExitTest<int>();
+ Gen<Guid>.EnterExitTest<int>();
+ Gen<RefX1<int>>.EnterExitTest<int>();
+ Gen<RefX1<string>>.EnterExitTest<int>();
+ Gen<ValX1<int>>.EnterExitTest<int>();
+ Gen<ValX1<string>>.EnterExitTest<int>();
+
+ Gen<int>.EnterExitTest<double>();
+ Gen<string>.EnterExitTest<double>();
+ Gen<object>.EnterExitTest<double>();
+ Gen<Guid>.EnterExitTest<double>();
+ Gen<RefX1<int>>.EnterExitTest<double>();
+ Gen<RefX1<string>>.EnterExitTest<double>();
+ Gen<ValX1<int>>.EnterExitTest<double>();
+ Gen<ValX1<string>>.EnterExitTest<double>();
+
+ Gen<int>.EnterExitTest<string>();
+ Gen<double>.EnterExitTest<string>();
+ Gen<object>.EnterExitTest<string>();
+ Gen<Guid>.EnterExitTest<string>();
+ Gen<RefX1<int>>.EnterExitTest<string>();
+ Gen<RefX1<string>>.EnterExitTest<string>();
+ Gen<ValX1<int>>.EnterExitTest<string>();
+ Gen<ValX1<string>>.EnterExitTest<string>();
+
+ Gen<int>.EnterExitTest<object>();
+ Gen<double>.EnterExitTest<object>();
+ Gen<string>.EnterExitTest<object>();
+ Gen<Guid>.EnterExitTest<object>();
+ Gen<RefX1<int>>.EnterExitTest<object>();
+ Gen<RefX1<string>>.EnterExitTest<object>();
+ Gen<ValX1<int>>.EnterExitTest<object>();
+ Gen<ValX1<string>>.EnterExitTest<object>();
+
+ Gen<int>.EnterExitTest<Guid>();
+ Gen<double>.EnterExitTest<Guid>();
+ Gen<string>.EnterExitTest<Guid>();
+ Gen<object>.EnterExitTest<Guid>();
+ Gen<RefX1<int>>.EnterExitTest<Guid>();
+ Gen<RefX1<string>>.EnterExitTest<Guid>();
+ Gen<ValX1<int>>.EnterExitTest<Guid>();
+ Gen<ValX1<string>>.EnterExitTest<Guid>();
+
+ Gen<int>.EnterExitTest<RefX1<int>>();
+ Gen<double>.EnterExitTest<RefX1<int>>();
+ Gen<string>.EnterExitTest<RefX1<int>>();
+ Gen<object>.EnterExitTest<RefX1<int>>();
+ Gen<Guid>.EnterExitTest<RefX1<int>>();
+ Gen<RefX1<string>>.EnterExitTest<RefX1<int>>();
+ Gen<ValX1<int>>.EnterExitTest<RefX1<int>>();
+ Gen<ValX1<string>>.EnterExitTest<RefX1<int>>();
+
+ Gen<int>.EnterExitTest<RefX1<string>>();
+ Gen<double>.EnterExitTest<RefX1<string>>();
+ Gen<string>.EnterExitTest<RefX1<string>>();
+ Gen<object>.EnterExitTest<RefX1<string>>();
+ Gen<Guid>.EnterExitTest<RefX1<string>>();
+ Gen<RefX1<int>>.EnterExitTest<RefX1<string>>();
+ Gen<ValX1<int>>.EnterExitTest<RefX1<string>>();
+ Gen<ValX1<string>>.EnterExitTest<RefX1<string>>();
+
+ Gen<int>.EnterExitTest<ValX1<int>>();
+ Gen<double>.EnterExitTest<ValX1<int>>();
+ Gen<string>.EnterExitTest<ValX1<int>>(); //offending line
+ Gen<object>.EnterExitTest<ValX1<int>>(); //offending line
+ Gen<Guid>.EnterExitTest<ValX1<int>>();
+ Gen<RefX1<int>>.EnterExitTest<ValX1<int>>(); //offending line
+ Gen<RefX1<string>>.EnterExitTest<ValX1<int>>(); //offending line
+ Gen<ValX1<string>>.EnterExitTest<ValX1<int>>(); //offending line
+
+ Gen<int>.EnterExitTest<ValX1<string>>(); //offending line
+ Gen<double>.EnterExitTest<ValX1<string>>(); //offending line
+ Gen<string>.EnterExitTest<ValX1<string>>(); //offending line
+ Gen<object>.EnterExitTest<ValX1<string>>(); //offending line
+ Gen<Guid>.EnterExitTest<ValX1<string>>(); //offending line
+ Gen<RefX1<int>>.EnterExitTest<ValX1<string>>(); //offending line
+ Gen<RefX1<string>>.EnterExitTest<ValX1<string>>(); //offending line
+ Gen<ValX1<int>>.EnterExitTest<ValX1<string>>(); //offending line
+
+
+ if (result)
+ {
+ Console.WriteLine("Test Passed");
+ return 100;
+ }
+ else
+ {
+ Console.WriteLine("Test Failed");
+ return 1;
+ }
+ }
+}
+
+