System.Drawing: added email to icon and test file headers
[mono.git] / mcs / class / System.Threading.Tasks.Dataflow / System.Threading.Tasks.Dataflow / ActionBlock.cs
1 // ActionBlock.cs
2 //
3 // Copyright (c) 2011 Jérémie "garuma" Laval
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in
13 // all copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 // THE SOFTWARE.
22 //
23 //
24
25
26 using System;
27 using System.Threading;
28 using System.Threading.Tasks;
29 using System.Collections.Concurrent;
30
31 namespace System.Threading.Tasks.Dataflow
32 {
33         public sealed class ActionBlock<TInput> : ITargetBlock<TInput>, IDataflowBlock
34         {
35                 static readonly ExecutionDataflowBlockOptions defaultOptions = new ExecutionDataflowBlockOptions ();
36
37                 CompletionHelper compHelper = CompletionHelper.GetNew ();
38                 BlockingCollection<TInput> messageQueue = new BlockingCollection<TInput> ();
39                 ExecutingMessageBox<TInput> messageBox;
40                 Action<TInput> action;
41                 ExecutionDataflowBlockOptions dataflowBlockOptions;
42
43
44                 public ActionBlock (Action<TInput> action) : this (action, defaultOptions)
45                 {
46                         
47                 }
48
49                 public ActionBlock (Action<TInput> action, ExecutionDataflowBlockOptions dataflowBlockOptions)
50                 {
51                         if (action == null)
52                                 throw new ArgumentNullException ("action");
53                         if (dataflowBlockOptions == null)
54                                 throw new ArgumentNullException ("dataflowBlockOptions");
55
56                         this.action = action;
57                         this.dataflowBlockOptions = dataflowBlockOptions;
58                         this.messageBox = new ExecutingMessageBox<TInput> (messageQueue, compHelper, () => true, ProcessQueue, dataflowBlockOptions);
59                 }
60
61                 [MonoTODO]
62                 public ActionBlock (Func<TInput, Task> action) : this (action, defaultOptions)
63                 {
64                         throw new NotImplementedException ();
65                 }
66
67                 [MonoTODO]
68                 public ActionBlock (Func<TInput, Task> action, ExecutionDataflowBlockOptions dataflowBlockOptions)
69                 {
70                         throw new NotImplementedException ();
71                 }
72
73                 public DataflowMessageStatus OfferMessage (DataflowMessageHeader messageHeader,
74                                                            TInput messageValue,
75                                                            ISourceBlock<TInput> source,
76                                                            bool consumeToAccept)
77                 {
78                         return messageBox.OfferMessage (this, messageHeader, messageValue, source, consumeToAccept);
79                 }
80
81                 void ProcessQueue ()
82                 {
83                         TInput data;
84                         while (messageQueue.TryTake (out data))
85                                 action (data);
86                 }
87
88                 public void Complete ()
89                 {
90                         messageBox.Complete ();
91                 }
92
93                 public void Fault (Exception ex)
94                 {
95                         compHelper.Fault (ex);
96                 }
97
98                 public Task Completion {
99                         get {
100                                 return compHelper.Completion;
101                         }
102                 }
103
104                 public int InputCount {
105                         get {
106                                 return messageQueue.Count;
107                         }
108                 }
109         }
110 }
111