[jit] Fix the saving of the 'cfg->ret_var_set' flag when inlining, it was set to...
[mono.git] / mono / tests / interlocked-2.2.cs
old mode 100755 (executable)
new mode 100644 (file)
index 3b0bc02..c16f700
@@ -4,10 +4,8 @@ using System.Threading;
 public class InterlockTest
 {
        public int test;
-       public int ltest;
+       public long ltest;
 
-       static int s_test;
-       
        public static int Main() {
                int a,b;
                long la, lb;
@@ -18,33 +16,81 @@ public class InterlockTest
                it.test = 2;
                int c = Interlocked.Add (ref it.test, 1);
                if (c != 3)
-                       return -1;
+                       return 1;
 
                if (it.test != 3)
-                       return -2;
+                       return 2;
 
                a = 1;
                b = Interlocked.Add (ref a, 1);
                if (a != 2)
-                       return -3;
+                       return 3;
                if (b != 2)
-                       return -4;
+                       return 4;
 
                /* long */
                it.ltest = 2;
-               int lc = Interlocked.Add (ref it.ltest, 1);
+               long lc = Interlocked.Add (ref it.ltest, 1);
                if (lc != 3)
-                       return -5;
+                       return 5;
 
                if (it.ltest != 3)
-                       return -6;
+                       return 6;
 
                la = 1;
                lb = Interlocked.Add (ref la, 1);
                if (la != 2)
-                       return -7;
+                       return 7;
                if (lb != 2)
-                       return -8;
+                       return 8;
+
+               if (Interlocked.Read (ref la) != 2)
+                       return 9;
+
+               la = 1;
+               lc = Interlocked.Exchange (ref la, 2);
+               if (lc != 1)
+                       return 10;
+
+               if (la != 2)
+                       return 11;
+
+               /* Generics */
+               InterlockTest o1 = new InterlockTest ();
+               InterlockTest o2 = new InterlockTest ();
+               InterlockTest o = o1;
+
+               InterlockTest o3 = Interlocked.CompareExchange (ref o, o2, o2);
+               if (o3 != o1)
+                       return 12;
+               if (o != o1)
+                       return 13;
+
+               InterlockTest o4 = Interlocked.CompareExchange (ref o, o2, o1);
+               if (o4 != o1)
+                       return 14;
+               if (o != o2)
+                       return 15;
+
+               /* long increment/decrement */
+               la = 0x12345678;
+               lb = Interlocked.Increment (ref la);
+               if (la != 0x12345679)
+                       return 16;
+               if (lb != 0x12345679)
+                       return 16;
+               lb = Interlocked.Decrement (ref la);
+               if (la != 0x12345678)
+                       return 17;
+               if (lb != 0x12345678)
+                       return 18;              
+
+               la = 1;
+               lb = Interlocked.CompareExchange (ref la, 2, 1);
+               if (la != 2)
+                       return 19;
+               if (lb != 1)
+                       return 20;
 
                Console.WriteLine ("done!");