diff options
author | Rodrigo Kumpera <kumpera@users.noreply.github.com> | 2017-11-16 11:29:15 +0300 |
---|---|---|
committer | Marek Safar <marek.safar@gmail.com> | 2017-11-16 11:29:15 +0300 |
commit | 375471820c02ff0bab025bff75b5da7efc95d3cd (patch) | |
tree | d732d7ef2c377fbc43f586e85c4d948fa85e7068 /mcs/class/corlib | |
parent | c0f6935b45a91829133869e1828ee47eb890055a (diff) |
[corlib] Don't capture the execution context when UnsafeRegisterWaitForSingleObject is used. Fixes #60029 (#6013)
Diffstat (limited to 'mcs/class/corlib')
-rw-r--r-- | mcs/class/corlib/Test/System.Threading/ThreadPoolTest.cs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/mcs/class/corlib/Test/System.Threading/ThreadPoolTest.cs b/mcs/class/corlib/Test/System.Threading/ThreadPoolTest.cs index 86e735b9dbe..e86fd1d0e52 100644 --- a/mcs/class/corlib/Test/System.Threading/ThreadPoolTest.cs +++ b/mcs/class/corlib/Test/System.Threading/ThreadPoolTest.cs @@ -216,5 +216,44 @@ namespace MonoTests.System.Threading mre.WaitOne (); } + + [Test] + public void AsyncLocalCapture () + { + var asyncLocal = new AsyncLocal<int>(); + asyncLocal.Value = 1; + int var_0, var_1, var_2, var_3; + var_0 = var_1 = var_2 = var_3 = 99; + var cw = new CountdownEvent (4); + + var evt = new AutoResetEvent (false); + ThreadPool.QueueUserWorkItem(state => { + var_0 = asyncLocal.Value; + cw.Signal (); + }, null); + + ThreadPool.UnsafeQueueUserWorkItem(state => { + var_1 = asyncLocal.Value; + cw.Signal (); + }, null); + + ThreadPool.RegisterWaitForSingleObject (evt, (state, to) => { + var_2 = asyncLocal.Value; + cw.Signal (); + }, null, 1, false); + + ThreadPool.UnsafeRegisterWaitForSingleObject (evt, (state, to) => { + var_3 = asyncLocal.Value; + cw.Signal (); + }, null, 1, false); + + Assert.IsTrue (cw.Wait (1000), "cw_wait"); + + Assert.AreEqual (1, var_0, "var_0"); + Assert.AreEqual (0, var_1, "var_1"); + Assert.AreEqual (1, var_2, "var_2"); + Assert.AreEqual (0, var_3, "var_3"); + } + } }
\ No newline at end of file |