Properly check the maxstacksize asked for the Thread
[mono.git] / mcs / class / corlib / System.Threading / CancellationToken.cs
index 16de2131ba5b4b0460c98f802675c0f3269f0db8..87dabbeea292fc8c7b8f2274915bed13486851cd 100644 (file)
@@ -33,11 +33,17 @@ namespace System.Threading
        [System.Diagnostics.DebuggerDisplay ("IsCancellationRequested = {IsCancellationRequested}")]
        public struct CancellationToken
        {
+               bool canBeCanceled;
+               bool initialized;
+               CancellationTokenSource source;
+
                public CancellationToken (bool canceled)
                        : this ()
                {
-                       // dummy, this is actually set by CancellationTokenSource when the token is created
-                       Source = null;
+                       initialized = true;
+                       canBeCanceled = canceled;
+                       // This is correctly set later if token originates from a Source
+                       source = canceled ? CancellationTokenSource.CanceledSource : CancellationTokenSource.NoneSource;
                }
 
                public static CancellationToken None {
@@ -74,7 +80,7 @@ namespace System.Threading
 
                public void ThrowIfCancellationRequested ()
                {
-                       if (Source.IsCancellationRequested)
+                       if (initialized && Source.IsCancellationRequested)
                                throw new OperationCanceledException (this);
                }
 
@@ -105,13 +111,13 @@ namespace System.Threading
 
                public bool CanBeCanceled {
                        get {
-                               return true;
+                               return canBeCanceled;
                        }
                }
 
                public bool IsCancellationRequested {
                        get {
-                               return Source.IsCancellationRequested;
+                               return initialized && Source.IsCancellationRequested;
                        }
                }
 
@@ -122,8 +128,20 @@ namespace System.Threading
                }
 
                internal CancellationTokenSource Source {
-                       get;
-                       set;
+                       get {
+                               if (!initialized)
+                                       CorrectlyInitialize ();
+                               return source;
+                       }
+                       set {
+                               source = value;
+                       }
+               }
+
+               void CorrectlyInitialize ()
+               {
+                       Source = CancellationTokenSource.NoneSource;
+                       initialized = true;
                }
        }
 }