Fixed completion of JoinTargets
authorPetr Onderka <gsvick@gmail.com>
Sun, 8 Jul 2012 18:21:42 +0000 (20:21 +0200)
committerPetr Onderka <gsvick@gmail.com>
Sun, 19 Aug 2012 21:55:14 +0000 (23:55 +0200)
mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/BatchedJoinBlock.cs
mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/BatchedJoinBlock`3.cs
mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/JoinBlock.cs
mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/JoinBlock`3.cs
mcs/class/System.Threading.Tasks.Dataflow/System.Threading.Tasks.Dataflow/JoinTarget.cs
mcs/class/System.Threading.Tasks.Dataflow/Test/System.Threading.Tasks.Dataflow/CompletionTest.cs

index 6d27e0a27743808a254038cdc4860299b9ab623f..f77b3a8aa4523b555da326856be350b6b4fd6d6e 100644 (file)
@@ -142,6 +142,8 @@ namespace System.Threading.Tasks.Dataflow {
 
                public void Complete ()
                {
+                       target1.Complete ();
+                       target2.Complete ();
                        outgoing.Complete ();
                }
 
index cc80859f75a5741c201fe60f00dbb522e8a2c7a9..832ac8bfc81402313bccc0bb32d9e2f9519d476b 100644 (file)
@@ -161,6 +161,9 @@ namespace System.Threading.Tasks.Dataflow {
 
                public void Complete ()
                {
+                       target1.Complete ();
+                       target2.Complete ();
+                       target3.Complete ();
                        outgoing.Complete ();
                }
 
index d03288cb588354ff5400f036b9f4588c57aa08b3..2d8f923b262938d8d4c0f4267c58d86fed055a6a 100644 (file)
@@ -97,6 +97,8 @@ namespace System.Threading.Tasks.Dataflow
 
                public void Complete ()
                {
+                       target1.Complete ();
+                       target2.Complete ();
                        outgoing.Complete ();
                }
 
index 880ccae208964508f3edfad83fc6e6861df3c77b..344b92ecb827b67b8ae61a0a242274a1415b4d26 100644 (file)
@@ -105,6 +105,9 @@ namespace System.Threading.Tasks.Dataflow
 
                public void Complete ()
                {
+                       target1.Complete ();
+                       target2.Complete ();
+                       target3.Complete ();
                        outgoing.Complete ();
                }
 
index 778ae185828c076c3ddd35ae984ab474b31d0230..63ab17ef41d3f46891a96288975f170cbc52ea74 100644 (file)
@@ -66,7 +66,7 @@ namespace System.Threading.Tasks.Dataflow {
 
                Task IDataflowBlock.Completion {
                        get {
-                               return joinBlock.Completion;
+                               throw new NotSupportedException();
                        }
                }
 
index 13e5af3b2f203fe6b4ee86e44a1648fcdad861a1..b031532d723f3c4c52fe39d46e03466b858661b0 100644 (file)
@@ -3,8 +3,10 @@
 //  
 // Author:
 //       Jérémie "garuma" Laval <jeremie.laval@gmail.com>
+//       Petr Onderka <gsvick@gmail.com>
 // 
 // Copyright (c) 2011 Jérémie "garuma" Laval
+// Copyright (c) 2012 Petr Onderka
 // 
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -25,8 +27,7 @@
 // THE SOFTWARE.
 
 using System;
-using System.Linq;
-using System.Threading;
+using System.Collections.Generic;
 using System.Threading.Tasks;
 using System.Threading.Tasks.Dataflow;
 
@@ -85,5 +86,39 @@ namespace MonoTests.System.Threading.Tasks.Dataflow
                        Assert.AreEqual (TaskStatus.Faulted, block.Completion.Status);
                        Assert.IsFalse (block.Post (43));
                }
+
+               static IEnumerable<Tuple<IDataflowBlock, ITargetBlock<T>>>
+                       GetJoinBlocksWithTargets<T> ()
+               {
+                       Func<IDataflowBlock, ITargetBlock<T>, Tuple<IDataflowBlock, ITargetBlock<T>>>
+                               createTuple = Tuple.Create;
+
+                       var joinBlock = new JoinBlock<T, T> ();
+                       yield return createTuple (joinBlock, joinBlock.Target1);
+                       var joinBlock3 = new JoinBlock<T, T, T> ();
+                       yield return createTuple (joinBlock3, joinBlock3.Target1);
+                       var batchedJoinBlock = new BatchedJoinBlock<T, T> (2);
+                       yield return createTuple (batchedJoinBlock, batchedJoinBlock.Target1);
+                       var batchedJoinBlock3 = new BatchedJoinBlock<T, T, T> (2);
+                       yield return createTuple (batchedJoinBlock3, batchedJoinBlock3.Target1);
+               }
+
+               [Test]
+               public void JoinTargetCompletitionTest ()
+               {
+                       foreach (var tuple in GetJoinBlocksWithTargets<int> ()) {
+                               Assert.Throws<NotSupportedException> (
+                                       () => { var x = tuple.Item2.Completion; });
+                               Assert.IsTrue (tuple.Item2.Post (1));
+                               tuple.Item2.Complete ();
+                               Assert.IsFalse (tuple.Item2.Post (2));
+                       }
+
+                       foreach (var tuple in GetJoinBlocksWithTargets<int> ()) {
+                               Assert.IsTrue (tuple.Item2.Post (1));
+                               tuple.Item1.Complete ();
+                               Assert.IsFalse (tuple.Item2.Post (2));
+                       }
+               }
        }
 }
\ No newline at end of file