[io-layer] Extract socket (#4241)
[mono.git] / mono / tests / thread6.cs
index f8df7d22b16363b407448a04dcaf0d3f6750ff18..02f1093cd8e83d07bece152b9532b5b8faf2852e 100644 (file)
@@ -170,6 +170,64 @@ public class Tests {
                return 0;
        }
 
+       public static void HasTry ()
+       {
+               try {
+                       throw new Exception ("boop");
+               } catch (Exception e) {
+                       // See if we re-throw the thread abort exception here
+               }
+       }
+
+       public static int test_0_thread_abort_water_mark () 
+       {
+               Boolean failed = true;
+
+               try {
+                       Thread.CurrentThread.Abort ("test_0_thread_abort_water_mark");
+               } catch (ThreadAbortException e) {
+                       HasTry ();
+                       Thread.ResetAbort ();
+                       failed = false;
+               } finally {
+                       if (failed) {
+                               Thread.ResetAbort ();
+                               throw new Exception ("Threw pending ThreadAbort exception under stack threshold");
+                       }
+                       Console.WriteLine ("Working thread abort");
+               }
+
+               return 0;
+       }
+
+       public static int test_0_thread_abort_water_mark_other_exc () 
+       {
+               Boolean failed = true;
+
+               try {
+                       try {
+                               try {
+                                       Thread.CurrentThread.Abort ("TestKeepAbort");
+                               } catch (ThreadAbortException ta_ex) {
+                                       throw new ArgumentNullException("SpecificDummyException");
+                               }
+                       } catch (ArgumentNullException ex){
+                               // Throw ThreadAbortException here
+                       }
+               } catch (ThreadAbortException ex) {
+                       Console.WriteLine ("Retained thread abort exception");
+                       failed = false;
+                       Thread.ResetAbort ();
+               } catch (Exception e) {
+                       failed = true;
+               } finally {
+                       if (failed)
+                               throw new Exception ("Lost the thread abort due to another exception running.");
+               }
+
+               return 0;
+       }
+
        public class CBO : ContextBoundObject {
                public void Run () {
                        Thread.CurrentThread.Abort ("FOO");
@@ -198,6 +256,49 @@ public class Tests {
                return success ? 0 : 1;
        }
 
+       public static int test_0_regress_4413 () {
+               // Check that thread abort exceptions originating in another thread are not automatically rethrown
+               object o = new object ();
+               Thread t = null;
+               bool waiting = false;
+               Action a = delegate () {
+                       t = Thread.CurrentThread;
+                       while (true) {
+                               lock (o) {
+                                       if (waiting) {
+                                               Monitor.Pulse (o);
+                                               break;
+                                       }
+                               }
+
+                               Thread.Sleep (10);
+                       }
+                       while (true) {
+                               Thread.Sleep (1000);
+                       }
+               };
+               var ar = a.BeginInvoke (null, null);
+               lock (o) {
+                       waiting = true;
+                       Monitor.Wait (o);
+               }
+
+               t.Abort ();
+
+               try {
+                       try {
+                               a.EndInvoke (ar);
+                       } catch (ThreadAbortException) {
+                       }
+               } catch (ThreadAbortException) {
+                       // This will fail
+                       Thread.ResetAbort ();
+                       return 1;
+               }
+
+               return 0;
+       }
+
        public static void Run ()
        {
                try {