System.Drawing: added email to icon and test file headers
[mono.git] / mcs / class / System.Threading.Tasks.Dataflow / System.Threading.Tasks / ConcurrentExclusiveSchedulerPair.cs
index b09ce5d38645315c6ffecce28182cfc18670a173..5127796cafe19a4146a7193e6703077a05dd2127 100644 (file)
@@ -22,8 +22,6 @@
 //
 //
 
-#if NET_4_0 || MOBILE
-
 using System;
 using System.Threading;
 using System.Collections.Generic;
@@ -45,18 +43,21 @@ namespace System.Threading.Tasks
 
                readonly ReaderWriterLockSlim rwl = new ReaderWriterLockSlim ();
                readonly TaskCompletionSource<object> completion = new TaskCompletionSource<object> ();
-               readonly ConcurrentTaskScheduler concurrent;
-               readonly ExclusiveTaskScheduler exclusive;
+               readonly InnerTaskScheduler concurrent;
+               readonly InnerTaskScheduler exclusive;
 
                int numTask;
 
-               class ExclusiveTaskScheduler : TaskScheduler
+               class InnerTaskScheduler : TaskScheduler
                {
-                       ConcurrentExclusiveSchedulerPair scheduler;
+                       readonly ConcurrentExclusiveSchedulerPair scheduler;
+                       readonly ConcurrentQueue<Task> queue;
 
-                       public ExclusiveTaskScheduler (ConcurrentExclusiveSchedulerPair scheduler)
+                       public InnerTaskScheduler (ConcurrentExclusiveSchedulerPair scheduler,
+                                                      ConcurrentQueue<Task> queue)
                        {
                                this.scheduler = scheduler;
+                               this.queue = queue;
                        }
 
                        public override int MaximumConcurrencyLevel {
@@ -67,42 +68,7 @@ namespace System.Threading.Tasks
 
                        protected override void QueueTask (Task t)
                        {
-                               scheduler.QueueExclusive (t);
-                       }
-
-                       protected override bool TryExecuteTaskInline (Task task, bool taskWasPreviouslyQueued)
-                       {
-                               if (task.Status != TaskStatus.Created)
-                                       return false;
-
-                               task.RunSynchronously (scheduler.target);
-                               return true;
-                       }
-
-                       protected override IEnumerable<Task> GetScheduledTasks ()
-                       {
-                               throw new NotImplementedException ();
-                       }
-               }
-
-               class ConcurrentTaskScheduler : TaskScheduler
-               {
-                       ConcurrentExclusiveSchedulerPair scheduler;
-
-                       public ConcurrentTaskScheduler (ConcurrentExclusiveSchedulerPair scheduler)
-                       {
-                               this.scheduler = scheduler;
-                       }
-
-                       public override int MaximumConcurrencyLevel {
-                               get {
-                                       return scheduler.maxConcurrencyLevel;
-                               }
-                       }
-
-                       protected override void QueueTask (Task t)
-                       {
-                               scheduler.QueueConcurrent (t);
+                               scheduler.DoQueue (t, queue);
                        }
 
                        protected override bool TryExecuteTaskInline (Task task, bool taskWasPreviouslyQueued)
@@ -119,6 +85,7 @@ namespace System.Threading.Tasks
                                TryExecuteTask (t);
                        }
 
+                       [MonoTODO ("Only useful for debugger support")]
                        protected override IEnumerable<Task> GetScheduledTasks ()
                        {
                                throw new NotImplementedException ();
@@ -145,8 +112,8 @@ namespace System.Threading.Tasks
                        this.maxItemsPerTask = maxItemsPerTask;
                        this.factory = new TaskFactory (taskScheduler);
                        this.taskHandler = InternalTaskProcesser;
-                       this.concurrent = new ConcurrentTaskScheduler (this);
-                       this.exclusive = new ExclusiveTaskScheduler (this);
+                       this.concurrent = new InnerTaskScheduler (this, concurrentTasks);
+                       this.exclusive = new InnerTaskScheduler (this, exclusiveTasks);
                }
 
                public void Complete ()
@@ -177,20 +144,14 @@ namespace System.Threading.Tasks
                        Dispose (true);
                }
 
+               [MonoTODO]
                protected virtual void Dispose (bool disposing)
                {
-                       throw new NotImplementedException ();
                }
 
-               void QueueExclusive (Task task)
+               void DoQueue (Task task, ConcurrentQueue<Task> queue)
                {
-                       exclusiveTasks.Enqueue (task);
-                       SpinUpTasks ();
-               }
-
-               void QueueConcurrent (Task task)
-               {
-                       concurrentTasks.Enqueue (task);
+                       queue.Enqueue (task);
                        SpinUpTasks ();
                }
 
@@ -255,5 +216,3 @@ namespace System.Threading.Tasks
                }
        }
 }
-
-#endif
\ No newline at end of file