diff options
author | Jiyoung Yun <jy910.yun@samsung.com> | 2017-04-13 14:17:19 +0900 |
---|---|---|
committer | Jiyoung Yun <jy910.yun@samsung.com> | 2017-04-13 14:17:19 +0900 |
commit | a56e30c8d33048216567753d9d3fefc2152af8ac (patch) | |
tree | 7e5d979695fc4a431740982eb1cfecc2898b23a5 /src/mscorlib/src/System/Threading/Tasks/TaskExceptionHolder.cs | |
parent | 4b11dc566a5bbfa1378d6266525c281b028abcc8 (diff) | |
download | coreclr-a56e30c8d33048216567753d9d3fefc2152af8ac.tar.gz coreclr-a56e30c8d33048216567753d9d3fefc2152af8ac.tar.bz2 coreclr-a56e30c8d33048216567753d9d3fefc2152af8ac.zip |
Imported Upstream version 2.0.0.11353upstream/2.0.0.11353
Diffstat (limited to 'src/mscorlib/src/System/Threading/Tasks/TaskExceptionHolder.cs')
-rw-r--r-- | src/mscorlib/src/System/Threading/Tasks/TaskExceptionHolder.cs | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/src/mscorlib/src/System/Threading/Tasks/TaskExceptionHolder.cs b/src/mscorlib/src/System/Threading/Tasks/TaskExceptionHolder.cs index ee1112a93f..1385d907e0 100644 --- a/src/mscorlib/src/System/Threading/Tasks/TaskExceptionHolder.cs +++ b/src/mscorlib/src/System/Threading/Tasks/TaskExceptionHolder.cs @@ -70,9 +70,9 @@ namespace System.Threading.Tasks private static void EnsureADUnloadCallbackRegistered() { - if (s_adUnloadEventHandler == null && - Interlocked.CompareExchange( ref s_adUnloadEventHandler, - AppDomainUnloadCallback, + if (s_adUnloadEventHandler == null && + Interlocked.CompareExchange(ref s_adUnloadEventHandler, + AppDomainUnloadCallback, null) == null) { AppDomain.CurrentDomain.DomainUnload += s_adUnloadEventHandler; @@ -93,7 +93,7 @@ namespace System.Threading.Tasks // We need to do this filtering because all TaskExceptionHolders will be finalized during shutdown or unload // regardles of reachability of the task (i.e. even if the user code was about to observe the task's exception), // which can otherwise lead to spurious crashes during shutdown. - if (m_faultExceptions != null && !m_isHandled && + if (m_faultExceptions != null && !m_isHandled && !Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload() && !s_domainUnloadStarted) { // We don't want to crash the finalizer thread if any ThreadAbortExceptions @@ -124,14 +124,14 @@ namespace System.Threading.Tasks // will have been marked as handled before even getting here. // Give users a chance to keep this exception from crashing the process - + // First, publish the unobserved exception and allow users to observe it AggregateException exceptionToThrow = new AggregateException( - Environment.GetResourceString("TaskExceptionHolder_UnhandledException"), + SR.TaskExceptionHolder_UnhandledException, m_faultExceptions); UnobservedTaskExceptionEventArgs ueea = new UnobservedTaskExceptionEventArgs(exceptionToThrow); TaskScheduler.PublishUnobservedTaskException(m_task, ueea); - + // Now, if we are still unobserved and we're configured to crash on unobserved, throw the exception. // We need to publish the event above even if we're not going to crash, hence // why this check doesn't come at the beginning of the method. @@ -164,7 +164,7 @@ namespace System.Threading.Tasks { Contract.Requires(exceptionObject != null, "TaskExceptionHolder.Add(): Expected a non-null exceptionObject"); Contract.Requires( - exceptionObject is Exception || exceptionObject is IEnumerable<Exception> || + exceptionObject is Exception || exceptionObject is IEnumerable<Exception> || exceptionObject is ExceptionDispatchInfo || exceptionObject is IEnumerable<ExceptionDispatchInfo>, "TaskExceptionHolder.Add(): Expected Exception, IEnumerable<Exception>, ExceptionDispatchInfo, or IEnumerable<ExceptionDispatchInfo>"); @@ -180,16 +180,16 @@ namespace System.Threading.Tasks private void SetCancellationException(object exceptionObject) { Contract.Requires(exceptionObject != null, "Expected exceptionObject to be non-null."); - - Debug.Assert(m_cancellationException == null, + + Debug.Assert(m_cancellationException == null, "Expected SetCancellationException to be called only once."); - // Breaking this assumption will overwrite a previously OCE, - // and implies something may be wrong elsewhere, since there should only ever be one. + // Breaking this assumption will overwrite a previously OCE, + // and implies something may be wrong elsewhere, since there should only ever be one. - Debug.Assert(m_faultExceptions == null, + Debug.Assert(m_faultExceptions == null, "Expected SetCancellationException to be called before any faults were added."); - // Breaking this assumption shouldn't hurt anything here, but it implies something may be wrong elsewhere. - // If this changes, make sure to only conditionally mark as handled below. + // Breaking this assumption shouldn't hurt anything here, but it implies something may be wrong elsewhere. + // If this changes, make sure to only conditionally mark as handled below. // Store the cancellation exception var oce = exceptionObject as OperationCanceledException; @@ -267,21 +267,21 @@ namespace System.Threading.Tasks exceptions.AddRange(ediColl); #if DEBUG Debug.Assert(exceptions.Count > 0, "There should be at least one dispatch info."); - foreach(var tmp in exceptions) + foreach (var tmp in exceptions) { Debug.Assert(tmp != null, "No dispatch infos should be null"); } #endif } - // Anything else is a programming error + // Anything else is a programming error else { - throw new ArgumentException(Environment.GetResourceString("TaskExceptionHolder_UnknownExceptionType"), nameof(exceptionObject)); + throw new ArgumentException(SR.TaskExceptionHolder_UnknownExceptionType, nameof(exceptionObject)); } } } } - + // If all of the exceptions are ThreadAbortExceptions and/or // AppDomainUnloadExceptions, we do not want the finalization |