From c57e1f5b68139ea3267b54baf7e0b3c9c77dd719 Mon Sep 17 00:00:00 2001 From: Rafael Munitic Date: Fri, 18 Mar 2011 13:18:20 +0100 Subject: [PATCH 1/5] If the function is null Wait will not get called and will not check if Future is in faulted state/raise the exception --- mcs/class/corlib/System.Threading.Tasks/Future.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mcs/class/corlib/System.Threading.Tasks/Future.cs b/mcs/class/corlib/System.Threading.Tasks/Future.cs index e6c5c88141f4..26907959c5db 100644 --- a/mcs/class/corlib/System.Threading.Tasks/Future.cs +++ b/mcs/class/corlib/System.Threading.Tasks/Future.cs @@ -40,8 +40,11 @@ public class Task: Task [System.Diagnostics.DebuggerBrowsable (System.Diagnostics.DebuggerBrowsableState.Never)] public TResult Result { get { - if (function != null) + if (function != null) { Wait (); + } else if (Exception != null) { + throw Exception; + } return value; } internal set { From e74f4ebe8c1616bb7b76829ed3e461eb7f66f9f0 Mon Sep 17 00:00:00 2001 From: Rafael Munitic Date: Fri, 18 Mar 2011 13:31:31 +0100 Subject: [PATCH 2/5] Must pass null to overloaded constructor instead of wrapper lambda (TaskCompletionSource can use overloaded constructors and it will pass null in function argument) --- mcs/class/corlib/System.Threading.Tasks/Future.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mcs/class/corlib/System.Threading.Tasks/Future.cs b/mcs/class/corlib/System.Threading.Tasks/Future.cs index 26907959c5db..8f311bac8008 100644 --- a/mcs/class/corlib/System.Threading.Tasks/Future.cs +++ b/mcs/class/corlib/System.Threading.Tasks/Future.cs @@ -64,19 +64,19 @@ public Task (Func function) : this (function, TaskCreationOptions.None) } public Task (Func function, CancellationToken cancellationToken) - : this ((o) => function (), null, cancellationToken, TaskCreationOptions.None) + : this (function == null ? (Func)null : (o) => function(), null, cancellationToken, TaskCreationOptions.None) { } public Task (Func function, TaskCreationOptions creationOptions) - : this ((o) => function (), null, CancellationToken.None, creationOptions) + : this (function == null ? (Func)null : (o) => function(), null, CancellationToken.None, creationOptions) { } public Task (Func function, CancellationToken cancellationToken, TaskCreationOptions creationOptions) - : this ((o) => function (), null, cancellationToken, creationOptions) + : this (function == null ? (Func)null : (o) => function(), null, cancellationToken, creationOptions) { } From 2572021d5f38c81545f61c66ec4d876fdd9315c3 Mon Sep 17 00:00:00 2001 From: Rafael Munitic Date: Fri, 18 Mar 2011 13:36:58 +0100 Subject: [PATCH 3/5] Continuation options should be checked as flags ? --- .../corlib/System.Threading.Tasks/Task.cs | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/mcs/class/corlib/System.Threading.Tasks/Task.cs b/mcs/class/corlib/System.Threading.Tasks/Task.cs index e9168dd9b9d7..7bc0aea17c01 100644 --- a/mcs/class/corlib/System.Threading.Tasks/Task.cs +++ b/mcs/class/corlib/System.Threading.Tasks/Task.cs @@ -302,27 +302,27 @@ bool ContinuationStatusCheck (TaskContinuationOptions kind) if (kindCode >= ((int)TaskContinuationOptions.NotOnRanToCompletion)) { if (status == TaskStatus.Canceled) { - if (kind == TaskContinuationOptions.NotOnCanceled) - return false; - if (kind == TaskContinuationOptions.OnlyOnFaulted) - return false; - if (kind == TaskContinuationOptions.OnlyOnRanToCompletion) - return false; - } else if (status == TaskStatus.Faulted) { - if (kind == TaskContinuationOptions.NotOnFaulted) - return false; - if (kind == TaskContinuationOptions.OnlyOnCanceled) - return false; - if (kind == TaskContinuationOptions.OnlyOnRanToCompletion) - return false; - } else if (status == TaskStatus.RanToCompletion) { - if (kind == TaskContinuationOptions.NotOnRanToCompletion) - return false; - if (kind == TaskContinuationOptions.OnlyOnFaulted) - return false; - if (kind == TaskContinuationOptions.OnlyOnCanceled) - return false; - } + if ((kind & TaskContinuationOptions.NotOnCanceled) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnFaulted) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnRanToCompletion) > 0) + return false; + } else if (status == TaskStatus.Faulted) { + if ((kind & TaskContinuationOptions.NotOnFaulted) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnCanceled) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnRanToCompletion) > 0) + return false; + } else if (status == TaskStatus.RanToCompletion) { + if ((kind & TaskContinuationOptions.NotOnRanToCompletion) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnFaulted) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnCanceled) > 0) + return false; + } } return true; @@ -348,9 +348,9 @@ internal TaskCreationOptions GetCreationOptions (TaskContinuationOptions kind) return options; } - #endregion + #endregion - #region Internal and protected thingies +#region Internal and protected thingies internal void Schedule () { status = TaskStatus.WaitingToRun; @@ -469,9 +469,9 @@ void ProcessCompleteDelegates () while (completed.TryDequeue (out handler)) handler (this, EventArgs.Empty); } - #endregion + #endregion - #region Cancel and Wait related method +#region Cancel and Wait related method internal void CancelReal () { @@ -734,9 +734,9 @@ static int ComputeTimeout (int millisecondsTimeout, Watch watch) return millisecondsTimeout == -1 ? -1 : (int)Math.Max (watch.ElapsedMilliseconds - millisecondsTimeout, 1); } - #endregion + #endregion - #region Dispose +#region Dispose public void Dispose () { Dispose (true); @@ -751,9 +751,9 @@ protected virtual void Dispose (bool disposing) state = null; } } - #endregion + #endregion - #region Properties +#region Properties public static TaskFactory Factory { get { return defaultFactory; @@ -841,7 +841,7 @@ internal Task Parent { return parent; } } - #endregion + #endregion } } #endif From cbd5bc9cd4ec88d7a717a1db2e7d46a2760b6e0c Mon Sep 17 00:00:00 2001 From: Rafael Munitic Date: Fri, 18 Mar 2011 13:54:48 +0100 Subject: [PATCH 4/5] Fixed formatting error --- .../corlib/System.Threading.Tasks/Task.cs | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/mcs/class/corlib/System.Threading.Tasks/Task.cs b/mcs/class/corlib/System.Threading.Tasks/Task.cs index 7bc0aea17c01..285a4890de2e 100644 --- a/mcs/class/corlib/System.Threading.Tasks/Task.cs +++ b/mcs/class/corlib/System.Threading.Tasks/Task.cs @@ -302,27 +302,27 @@ bool ContinuationStatusCheck (TaskContinuationOptions kind) if (kindCode >= ((int)TaskContinuationOptions.NotOnRanToCompletion)) { if (status == TaskStatus.Canceled) { - if ((kind & TaskContinuationOptions.NotOnCanceled) > 0) - return false; - if ((kind & TaskContinuationOptions.OnlyOnFaulted) > 0) - return false; - if ((kind & TaskContinuationOptions.OnlyOnRanToCompletion) > 0) - return false; - } else if (status == TaskStatus.Faulted) { - if ((kind & TaskContinuationOptions.NotOnFaulted) > 0) - return false; - if ((kind & TaskContinuationOptions.OnlyOnCanceled) > 0) - return false; - if ((kind & TaskContinuationOptions.OnlyOnRanToCompletion) > 0) - return false; - } else if (status == TaskStatus.RanToCompletion) { - if ((kind & TaskContinuationOptions.NotOnRanToCompletion) > 0) - return false; - if ((kind & TaskContinuationOptions.OnlyOnFaulted) > 0) - return false; - if ((kind & TaskContinuationOptions.OnlyOnCanceled) > 0) - return false; - } + if ((kind & TaskContinuationOptions.NotOnCanceled) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnFaulted) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnRanToCompletion) > 0) + return false; + } else if (status == TaskStatus.Faulted) { + if ((kind & TaskContinuationOptions.NotOnFaulted) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnCanceled) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnRanToCompletion) > 0) + return false; + } else if (status == TaskStatus.RanToCompletion) { + if ((kind & TaskContinuationOptions.NotOnRanToCompletion) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnFaulted) > 0) + return false; + if ((kind & TaskContinuationOptions.OnlyOnCanceled) > 0) + return false; + } } return true; @@ -348,9 +348,9 @@ internal TaskCreationOptions GetCreationOptions (TaskContinuationOptions kind) return options; } - #endregion + #endregion -#region Internal and protected thingies + #region Internal and protected thingies internal void Schedule () { status = TaskStatus.WaitingToRun; @@ -469,9 +469,9 @@ void ProcessCompleteDelegates () while (completed.TryDequeue (out handler)) handler (this, EventArgs.Empty); } - #endregion + #endregion -#region Cancel and Wait related method + #region Cancel and Wait related method internal void CancelReal () { @@ -734,9 +734,9 @@ static int ComputeTimeout (int millisecondsTimeout, Watch watch) return millisecondsTimeout == -1 ? -1 : (int)Math.Max (watch.ElapsedMilliseconds - millisecondsTimeout, 1); } - #endregion + #endregion -#region Dispose + #region Dispose public void Dispose () { Dispose (true); @@ -751,9 +751,9 @@ protected virtual void Dispose (bool disposing) state = null; } } - #endregion + #endregion -#region Properties + #region Properties public static TaskFactory Factory { get { return defaultFactory; @@ -841,7 +841,7 @@ internal Task Parent { return parent; } } - #endregion + #endregion } } #endif From ffa72c9dfb39c175f788060383596792405fd402 Mon Sep 17 00:00:00 2001 From: Rafael Munitic Date: Fri, 18 Mar 2011 13:59:36 +0100 Subject: [PATCH 5/5] Fixed formatting error --- mcs/class/corlib/System.Threading.Tasks/Future.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mcs/class/corlib/System.Threading.Tasks/Future.cs b/mcs/class/corlib/System.Threading.Tasks/Future.cs index 8f311bac8008..53b2fef2ff08 100644 --- a/mcs/class/corlib/System.Threading.Tasks/Future.cs +++ b/mcs/class/corlib/System.Threading.Tasks/Future.cs @@ -42,9 +42,9 @@ public TResult Result { get { if (function != null) { Wait (); - } else if (Exception != null) { - throw Exception; - } + } else if (Exception != null) { + throw Exception; + } return value; } internal set {