2010-01-20 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / class / corlib / System.Threading.Tasks / ParallelLoopState.cs
1 #if NET_4_0
2 // ParallelState.cs
3 //
4 // Copyright (c) 2008 Jérémie "Garuma" Laval
5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal
8 // in the Software without restriction, including without limitation the rights
9 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 // copies of the Software, and to permit persons to whom the Software is
11 // furnished to do so, subject to the following conditions:
12 //
13 // The above copyright notice and this permission notice shall be included in
14 // all copies or substantial portions of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 // THE SOFTWARE.
23 //
24 //
25
26 using System;
27 using System.Threading;
28
29 namespace System.Threading.Tasks
30 {
31         public class ParallelLoopState
32         {
33                 internal class ExternalInfos
34                 {
35                         public AtomicBoolean IsStopped = new AtomicBoolean ();
36                         public AtomicBoolean IsBroken = new AtomicBoolean ();
37                         public volatile bool IsExceptional;
38                         public long? LowestBreakIteration;
39                 }
40                 
41                 Task[] tasks;
42                 ExternalInfos extInfos;
43                 
44                 internal ParallelLoopState (Task[] tasks, ExternalInfos extInfos)
45                 {
46                         this.tasks = tasks;
47                         this.extInfos = extInfos;
48                 }
49                 
50                 public bool IsStopped {
51                         get {
52                                 return extInfos.IsStopped.Value;
53                         }
54                 }
55                 
56                 public bool IsExceptional {
57                         get {
58                                 return extInfos.IsExceptional;
59                         }
60                 }
61                 
62                 public long? LowestBreakIteration {
63                         get {
64                                 return extInfos.LowestBreakIteration;
65                         }
66                 }
67                 
68                 internal int CurrentIteration {
69                         get;
70                         set;
71                 }
72                 
73                 public bool ShouldExitCurrentIteration {
74                         get {
75                                 return IsExceptional || IsStopped;
76                         }
77                 }
78                 
79                 public void Break ()
80                 {
81                         bool result = extInfos.IsBroken.Exchange (true);
82                         if (!result)
83                                 extInfos.LowestBreakIteration = CurrentIteration;
84                 }
85                 
86                 public void Stop ()
87                 {
88                         bool result = extInfos.IsStopped.Exchange (true);
89                         if (!result) {
90                                 foreach (var t in tasks) {
91                                         if (t == null)
92                                                 continue;
93                                         t.Cancel ();
94                                 }
95                         }
96                 }
97         }
98         
99 }
100 #endif