diff --git a/ThirdParty/SmartThreadPool/SmartThreadPool.cs b/ThirdParty/SmartThreadPool/SmartThreadPool.cs index 929a09a6ca..6eba90edd1 100644 --- a/ThirdParty/SmartThreadPool/SmartThreadPool.cs +++ b/ThirdParty/SmartThreadPool/SmartThreadPool.cs @@ -826,6 +826,7 @@ namespace Amib.Threading InformCompleted(); FireOnThreadTermination(); _workItemsQueue.CloseThreadWaiter(); + CurrentThreadEntry = null; } } @@ -860,19 +861,8 @@ namespace Amib.Threading internal static void ValidateWorkItemsGroupWaitForIdle(IWorkItemsGroup workItemsGroup) { - if (null == CurrentThreadEntry) - { - return; - } - - WorkItem workItem = CurrentThreadEntry.CurrentWorkItem; - ValidateWorkItemsGroupWaitForIdleImpl(workItemsGroup, workItem); - if ((null != workItemsGroup) && - (null != workItem) && - CurrentThreadEntry.CurrentWorkItem.WasQueuedBy(workItemsGroup)) - { - throw new NotSupportedException("WaitForIdle cannot be called from a thread on its SmartThreadPool, it causes a deadlock"); - } + if (CurrentThreadEntry != null) + ValidateWorkItemsGroupWaitForIdleImpl(workItemsGroup, CurrentThreadEntry.CurrentWorkItem); } [MethodImpl(MethodImplOptions.NoInlining)] diff --git a/ThirdParty/SmartThreadPool/WorkItem.cs b/ThirdParty/SmartThreadPool/WorkItem.cs index 1a2cc7eccb..db54a15714 100644 --- a/ThirdParty/SmartThreadPool/WorkItem.cs +++ b/ThirdParty/SmartThreadPool/WorkItem.cs @@ -248,10 +248,7 @@ namespace Amib.Threading.Internal _workItemCompletedRefCount = 0; _waitingOnQueueStopwatch = new Stopwatch(); _processingStopwatch = new Stopwatch(); - _expirationTime = - _workItemInfo.Timeout > 0 ? - DateTime.UtcNow.Ticks + _workItemInfo.Timeout * TimeSpan.TicksPerMillisecond : - long.MaxValue; + _expirationTime = _workItemInfo.Timeout > 0 ? DateTime.UtcNow.Ticks + _workItemInfo.Timeout * TimeSpan.TicksPerMillisecond : long.MaxValue; } internal bool WasQueuedBy(IWorkItemsGroup workItemsGroup) @@ -653,24 +650,18 @@ namespace Amib.Threading.Internal { return _workItemState; } - - long nowTicks = DateTime.UtcNow.Ticks; - - if (WorkItemState.Canceled != _workItemState && nowTicks > _expirationTime) + if (WorkItemState.Canceled != _workItemState && DateTime.UtcNow.Ticks > _expirationTime) { _workItemState = WorkItemState.Canceled; - } - - if (WorkItemState.InProgress == _workItemState) - { return _workItemState; } - - if (CanceledSmartThreadPool.IsCanceled || CanceledWorkItemsGroup.IsCanceled) + if(WorkItemState.InProgress != _workItemState) { - return WorkItemState.Canceled; + if (CanceledSmartThreadPool.IsCanceled || CanceledWorkItemsGroup.IsCanceled) + { + return WorkItemState.Canceled; + } } - return _workItemState; } }