New tests.
[mono.git] / mcs / class / corlib / System.Threading.Tasks / TaskScheduler.cs
1 #if NET_4_0 || BOOTSTRAP_NET_4_0
2 // 
3 // TaskScheduler.cs
4 //  
5 // Author:
6 //       Jérémie "Garuma" Laval <jeremie.laval@gmail.com>
7 // 
8 // Copyright (c) 2009 Jérémie "Garuma" Laval
9 // 
10 // Permission is hereby granted, free of charge, to any person obtaining a copy
11 // of this software and associated documentation files (the "Software"), to deal
12 // in the Software without restriction, including without limitation the rights
13 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 // copies of the Software, and to permit persons to whom the Software is
15 // furnished to do so, subject to the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be included in
18 // all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 // THE SOFTWARE.
27
28 using System;
29 using System.Threading;
30 using System.Collections.Generic;
31
32 namespace System.Threading.Tasks
33 {
34         public abstract class TaskScheduler
35         {
36                 static TaskScheduler defaultScheduler = new Scheduler ();
37                 
38                 [ThreadStatic]
39                 static TaskScheduler currentScheduler;
40                 
41                 int id;
42                 static int lastId = int.MinValue;
43                 
44                 public static event EventHandler<UnobservedTaskExceptionEventArgs> UnobservedTaskException;
45                 
46                 protected TaskScheduler ()
47                 {
48                         this.id = Interlocked.Increment (ref lastId);
49                 }
50
51                 // FIXME: Probably not correct
52                 public static TaskScheduler FromCurrentSynchronizationContext ()
53                 {
54                         return Current;
55                 }
56                 
57                 public static TaskScheduler Default  {
58                         get {
59                                 return defaultScheduler;
60                         }
61                 }
62                 
63                 public static TaskScheduler Current  {
64                         get {
65                                 if (currentScheduler != null)
66                                         return currentScheduler;
67                                 
68                                 return defaultScheduler;
69                         }
70                         internal set {
71                                 currentScheduler = value;
72                         }
73                 }
74                 
75                 public int Id {
76                         get {
77                                 return id;
78                         }
79                 }
80                 
81                 public virtual int MaximumConcurrencyLevel {
82                         get {
83                                 return Environment.ProcessorCount;
84                         }
85                 }
86                 
87                 protected abstract IEnumerable<Task> GetScheduledTasks ();
88                 protected internal abstract void QueueTask (Task task);
89                 protected internal virtual bool TryDequeue (Task task)
90                 {
91                         throw new NotSupportedException ();
92                 }
93
94                 internal protected bool TryExecuteTask (Task task)
95                 {
96                         throw new NotSupportedException ();
97                 }
98
99                 protected abstract bool TryExecuteTaskInline (Task task, bool taskWasPreviouslyQueued);
100                 
101                 internal UnobservedTaskExceptionEventArgs FireUnobservedEvent (AggregateException e)
102                 {
103                         UnobservedTaskExceptionEventArgs args = new UnobservedTaskExceptionEventArgs (e);
104                         
105                         EventHandler<UnobservedTaskExceptionEventArgs> temp = UnobservedTaskException;
106                         if (temp == null)
107                                 return args;
108                         
109                         temp (this, args);
110                         
111                         return args;
112                 }
113         }
114 }
115 #endif