[corlib] Add test for ThreadLocal finalization
authorLudovic Henry <ludovic.henry@xamarin.com>
Tue, 26 May 2015 20:45:54 +0000 (17:45 -0300)
committerLudovic Henry <ludovic.henry@xamarin.com>
Wed, 27 May 2015 13:20:40 +0000 (10:20 -0300)
mcs/class/corlib/Test/System.Threading/ThreadLocalTests.cs

index 21d73b09582d49c9d1fcd0347e8dc15a7f785692..d892c5719176c332d1f8e9d05ba2a411924f0d40 100644 (file)
@@ -177,6 +177,42 @@ namespace MonoTests.System.Threading
                        Assert.AreEqual (42, threadLocal.Value, "#4");
                        Assert.AreEqual (1, nTimes, "#5");
                }
+
+               class SetMreOnFinalize
+               {
+                       ManualResetEventSlim m_mres;
+
+                       public SetMreOnFinalize (ManualResetEventSlim mres)
+                       {
+                               m_mres = mres;
+                       }
+
+                       ~SetMreOnFinalize()
+                       {
+                               m_mres.Set();
+                       }
+               }
+
+               [Test]
+               public void DisposeOnThreadExit ()
+               {
+                       var threadLocal = new ThreadLocal<SetMreOnFinalize>();
+                       var mres = new ManualResetEventSlim(false);
+                       var thread = new Thread (() => { threadLocal.Value = new SetMreOnFinalize (mres); });
+
+                       thread.Start ();
+                       thread.Join ();
+
+                       SpinWait.SpinUntil (() => {
+                               GC.Collect();
+                               GC.WaitForPendingFinalizers();
+                               GC.Collect();
+                               return mres.IsSet;
+                       }, 500);
+
+                       if (!mres.IsSet)
+                               Assert.Fail ();
+               }
        }
 }
 #endif