New test.
[mono.git] / mcs / class / corlib / System.Threading.Tasks / TaskManager.cs
1 #if NET_4_0
2 // TaskManager.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.Collections.Generic;
28
29 namespace System.Threading.Tasks
30 {
31         public class TaskManager: IDisposable
32         {
33                 static TaskManager tdefault = new TaskManager();
34                 static TaskManager tcurrent = tdefault;
35                 
36                 TaskManagerPolicy policy;
37                 
38                 IScheduler        sched;
39                 
40                 public TaskManager(): this(new TaskManagerPolicy())
41                 {
42                 }
43                 
44                 public TaskManager(TaskManagerPolicy policy): 
45                         this(policy, new Scheduler(policy.IdealProcessors * policy.IdealThreadsPerProcessor,
46                                                    policy.MaxStackSize, policy.ThreadPriority))
47                 {
48                 }
49                 
50                 internal TaskManager(TaskManagerPolicy policy, IScheduler sched)
51                 {
52                         this.policy = policy;
53                         this.sched = sched;
54                 }
55                 
56                 ~TaskManager()
57                 {
58                         Dispose(false);
59                 }
60                 
61                 public void Dispose()
62                 {
63                         Dispose(true);
64                 }
65                 
66                 protected virtual void Dispose(bool managedRes)
67                 {
68                         if (managedRes)
69                                 sched.Dispose();
70                 }
71                 
72                 internal void AddWork(Task t)
73                 {
74                         sched.AddWork(t);
75                 }
76                 
77                 internal void WaitForTask(Task task)
78                 {
79                         sched.ParticipateUntil(task);
80                 }
81                 
82                 internal bool WaitForTaskWithPredicate(Task task, Func<bool> predicate)
83                 {
84                         return sched.ParticipateUntil(task, predicate);
85                 }
86                 
87                 internal void WaitForTasksUntil(Func<bool> predicate)
88                 {
89                         sched.ParticipateUntil(predicate);
90                 }
91                 
92                 public TaskManagerPolicy Policy {
93                         get {
94                                 return policy;
95                         }
96                 }
97
98                 public static TaskManager Default {
99                         get {
100                                 return tdefault;
101                         }
102                 }
103
104                 public static TaskManager Current {
105                         get {
106                                 return tcurrent;
107                         }
108                         set {
109                                 if (value != null)
110                                         tcurrent = value;       
111                         }
112                 }
113                 
114                 // May be used if we want to feed a big bunch of Tasks without waking up Workers
115                 /*internal bool IsInhibited {
116                         set {
117                                 if (value)
118                                         sched.InhibitPulse();
119                                 else {
120                                         sched.UnInhibitPulse();
121                                         sched.PulseAll();
122                                 }
123                         }
124                 }*/
125         }
126 }
127 #endif