diff options
author | Alex Rønne Petersen <alexrp@xamarin.com> | 2014-12-03 21:19:51 +0300 |
---|---|---|
committer | Alex Rønne Petersen <alexrp@xamarin.com> | 2014-12-03 21:19:51 +0300 |
commit | bc876c24271684c27aa793f82cf5cdbc9c3a82e2 (patch) | |
tree | 28d62ea76723d80db474a81b1779a3d7cea66857 /mcs/class/System.Threading.Tasks.Dataflow | |
parent | aec3ef0e8ebee2acf54f454cfeff22c9a7577664 (diff) |
[bcl] Remove all uses of Thread.Volatile{Read,Write}.
These methods are broken, misleading, and generally harmful. Always prefer the
`Volatile` class over these to make intent clear and to get sensible semantics.
http://blog.alexrp.com/2014/03/30/dot-net-atomics-and-memory-model-semantics/
Diffstat (limited to 'mcs/class/System.Threading.Tasks.Dataflow')
6 files changed, 24 insertions, 24 deletions
diff --git a/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/ExecutingMessageBoxBase.cs b/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/ExecutingMessageBoxBase.cs index b87e8601f5e..d6015665b28 100644 --- a/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/ExecutingMessageBoxBase.cs +++ b/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/ExecutingMessageBoxBase.cs @@ -136,7 +136,7 @@ namespace System.Threading.Tasks.Dataflow { protected override void OutgoingQueueComplete () { if (MessageQueue.IsCompleted - && Thread.VolatileRead (ref degreeOfParallelism) == 1) + && Volatile.Read (ref degreeOfParallelism) == 1) outgoingQueueComplete (); } @@ -145,7 +145,7 @@ namespace System.Threading.Tasks.Dataflow { /// </summary> protected override void VerifyCompleteness () { - if (Thread.VolatileRead (ref degreeOfParallelism) == 1) + if (Volatile.Read (ref degreeOfParallelism) == 1) base.VerifyCompleteness (); } @@ -160,4 +160,4 @@ namespace System.Threading.Tasks.Dataflow { || iteration < Options.MaxMessagesPerTask); } } -}
\ No newline at end of file +} diff --git a/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/MessageBox.cs b/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/MessageBox.cs index 239a610f727..867f803a9aa 100644 --- a/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/MessageBox.cs +++ b/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/MessageBox.cs @@ -80,7 +80,7 @@ namespace System.Threading.Tasks.Dataflow { return DataflowMessageStatus.DecliningPermanently; var full = options.BoundedCapacity != -1 - && Thread.VolatileRead (ref itemCount) >= options.BoundedCapacity; + && Volatile.Read (ref itemCount) >= options.BoundedCapacity; if (!greedy || full) { if (source == null) return DataflowMessageStatus.Declined; @@ -252,7 +252,7 @@ namespace System.Threading.Tasks.Dataflow { void RetrievePostponed () { // BoundedCapacity can't be -1 here, because in that case there would be no postponing - while (Thread.VolatileRead (ref itemCount) < options.BoundedCapacity + while (Volatile.Read (ref itemCount) < options.BoundedCapacity && !postponedMessages.IsEmpty && !MessageQueue.IsAddingCompleted) { var block = postponedMessages.First ().Key; DataflowMessageHeader header; @@ -286,7 +286,7 @@ namespace System.Threading.Tasks.Dataflow { postponedProcessing.Value = false; // because of race - if ((Thread.VolatileRead (ref itemCount) < options.BoundedCapacity + if ((Volatile.Read (ref itemCount) < options.BoundedCapacity || MessageQueue.IsAddingCompleted) && !postponedMessages.IsEmpty) EnsurePostponedProcessing (); @@ -329,4 +329,4 @@ namespace System.Threading.Tasks.Dataflow { CompHelper.Complete (); } } -}
\ No newline at end of file +} diff --git a/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/TargetCollection.cs b/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/TargetCollection.cs index 8b49b461d1c..cdd9bcb5839 100644 --- a/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/TargetCollection.cs +++ b/mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/TargetCollection.cs @@ -167,7 +167,7 @@ namespace System.Threading.Tasks.Dataflow { { firstOffering = true; currentItem = item; - Thread.VolatileWrite (ref currentMessageHeaderId, ++lastMessageHeaderId); + Volatile.Write (ref currentMessageHeaderId, ++lastMessageHeaderId); ClearUnpostponed (); } @@ -184,14 +184,14 @@ namespace System.Threading.Tasks.Dataflow { public void ResetCurrentItem () { currentItem = default(T); - Thread.VolatileWrite (ref currentMessageHeaderId, 0); + Volatile.Write (ref currentMessageHeaderId, 0); } /// <summary> /// Is there an item to send right now? /// </summary> public bool HasCurrentItem { - get { return Thread.VolatileRead (ref currentMessageHeaderId) != 0; } + get { return Volatile.Read (ref currentMessageHeaderId) != 0; } } /// <summary> @@ -352,7 +352,7 @@ namespace System.Threading.Tasks.Dataflow { /// </summary> public bool VerifyHeader (DataflowMessageHeader header) { - return header.Id == Thread.VolatileRead (ref currentMessageHeaderId); + return header.Id == Volatile.Read (ref currentMessageHeaderId); } } @@ -520,4 +520,4 @@ namespace System.Threading.Tasks.Dataflow { return false; } } -}
\ No newline at end of file +} diff --git a/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/BoundedCapacityTest.cs b/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/BoundedCapacityTest.cs index 243bf6a74eb..bd8ccb579e0 100644 --- a/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/BoundedCapacityTest.cs +++ b/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/BoundedCapacityTest.cs @@ -133,7 +133,7 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { Assert.GreaterOrEqual (scheduler.ExecuteAll (), 1); - Assert.AreEqual (2, Thread.VolatileRead (ref n)); + Assert.AreEqual (2, Volatile.Read (ref n)); } [Test] @@ -156,7 +156,7 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { Assert.GreaterOrEqual (scheduler.ExecuteAll (), 1); - Assert.AreEqual (2, Thread.VolatileRead (ref n)); + Assert.AreEqual (2, Volatile.Read (ref n)); } int n; @@ -181,7 +181,7 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { Assert.IsFalse (transform.Post (102)); - Assert.AreEqual (10000, Thread.VolatileRead (ref n)); + Assert.AreEqual (10000, Volatile.Read (ref n)); } IEnumerable<int> ComputeResults () @@ -318,4 +318,4 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { throw new NotImplementedException (); } } -}
\ No newline at end of file +} diff --git a/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/ExecutionBlocksTest.cs b/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/ExecutionBlocksTest.cs index e4329e7982f..d523a8faa35 100644 --- a/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/ExecutionBlocksTest.cs +++ b/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/ExecutionBlocksTest.cs @@ -92,7 +92,7 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { var blocks = GetExecutionBlocksWithAction (() => { - if (Thread.VolatileRead (ref shouldRun) == 0) { + if (Volatile.Read (ref shouldRun) == 0) { ranAfterFault++; return; } @@ -122,7 +122,7 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { Thread.Sleep (100); - Assert.AreEqual (0, Thread.VolatileRead (ref ranAfterFault)); + Assert.AreEqual (0, Volatile.Read (ref ranAfterFault)); } } @@ -136,7 +136,7 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { var blocks = GetExecutionBlocksWithAsyncAction ( i => - tcs.Task.ContinueWith (t => Thread.VolatileWrite (ref result, i + t.Result)), + tcs.Task.ContinueWith (t => Volatile.Write (ref result, i + t.Result)), new ExecutionDataflowBlockOptions { TaskScheduler = scheduler }); foreach (var block in blocks) { @@ -160,7 +160,7 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { Assert.AreEqual (11, result); tcs = new TaskCompletionSource<int> (); - Thread.VolatileWrite (ref result, 0); + Volatile.Write (ref result, 0); } } @@ -196,4 +196,4 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { } } } -}
\ No newline at end of file +} diff --git a/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/OptionsTest.cs b/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/OptionsTest.cs index d59199e3fa0..27fce238a62 100644 --- a/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/OptionsTest.cs +++ b/mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/OptionsTest.cs @@ -215,10 +215,10 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { Assert.IsTrue (action.Post (1)); - Assert.AreEqual (0, Thread.VolatileRead (ref n)); + Assert.AreEqual (0, Volatile.Read (ref n)); Assert.AreEqual (1, scheduler.ExecuteAll ()); - Assert.AreEqual (1, Thread.VolatileRead (ref n)); + Assert.AreEqual (1, Volatile.Read (ref n)); } [Test] @@ -416,4 +416,4 @@ namespace MonoTests.System.Threading.Tasks.Dataflow { new[] { task1.Result, task2.Result }); } } -}
\ No newline at end of file +} |