From 1cf54d722fe1cd1ff6ca0b2fdc62717841230f1f Mon Sep 17 00:00:00 2001 From: cuteant Date: Thu, 1 Jul 2021 23:23:44 +0800 Subject: [PATCH] Ignore 'WakeupTask' in SingleThreadEventLoop::PollTask --- .../Concurrency/SingleThreadEventExecutor.cs | 2 +- .../Channels/SingleThreadEventLoop.cs | 11 +++++++---- .../Channels/SingleThreadEventLoopBase.cs | 6 +----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/DotNetty.Common/Concurrency/SingleThreadEventExecutor.cs b/src/DotNetty.Common/Concurrency/SingleThreadEventExecutor.cs index b46baa91d..32974bbe7 100644 --- a/src/DotNetty.Common/Concurrency/SingleThreadEventExecutor.cs +++ b/src/DotNetty.Common/Concurrency/SingleThreadEventExecutor.cs @@ -446,7 +446,7 @@ private bool TryTakeTask(long delayNanos, out IRunnable task) { const long MaxDelayMilliseconds = int.MaxValue - 1; - if ((ulong)delayNanos > 0UL) // delayNanos >= 0 + if ((ulong)delayNanos > 0UL) // delayNanos 为非负值 { var timeout = PreciseTime.ToMilliseconds(delayNanos); if (_blockingTaskQueue.TryTake(out task, (int)Math.Min(timeout, MaxDelayMilliseconds))) diff --git a/src/DotNetty.Transport/Channels/SingleThreadEventLoop.cs b/src/DotNetty.Transport/Channels/SingleThreadEventLoop.cs index a85f7e566..b82341d25 100644 --- a/src/DotNetty.Transport/Channels/SingleThreadEventLoop.cs +++ b/src/DotNetty.Transport/Channels/SingleThreadEventLoop.cs @@ -143,13 +143,16 @@ protected sealed override IRunnable PollTask() Debug.Assert(InEventLoop); - if (_taskQueue.TryDequeue(out IRunnable task)) { return task; } + var taskQueue = _taskQueue; + var task = PollTaskFrom(taskQueue); + if (task is object) { return task; } #if DEBUG if (_tailTasks.IsEmpty) { _emptyEvent.Reset(); } #else _emptyEvent.Reset(); #endif - if (_taskQueue.TryDequeue(out task) || IsShuttingDown) // revisit queue as producer might have put a task in meanwhile + task = PollTaskFrom(taskQueue); + if (task is object || IsShuttingDown) // revisit queue as producer might have put a task in meanwhile { return task; } @@ -158,7 +161,7 @@ protected sealed override IRunnable PollTask() if (ScheduledTaskQueue.TryPeek(out IScheduledRunnable nextScheduledTask)) { var delayNanos = nextScheduledTask.DelayNanos; - if ((ulong)delayNanos > 0UL) // delayNanos >= 0 + if ((ulong)delayNanos > 0UL) // delayNanos 为非负值 { var timeout = PreciseTime.ToMilliseconds(delayNanos); _emptyEvent.Wait((int)Math.Min(timeout, MaxDelayMilliseconds)); @@ -167,7 +170,7 @@ protected sealed override IRunnable PollTask() else { if (!IsShuttingDown) { _emptyEvent.Wait(); } - _ = _taskQueue.TryDequeue(out task); + task = PollTaskFrom(taskQueue); } return task; } diff --git a/src/DotNetty.Transport/Channels/SingleThreadEventLoopBase.cs b/src/DotNetty.Transport/Channels/SingleThreadEventLoopBase.cs index af0d9e83a..d4aeea378 100644 --- a/src/DotNetty.Transport/Channels/SingleThreadEventLoopBase.cs +++ b/src/DotNetty.Transport/Channels/SingleThreadEventLoopBase.cs @@ -105,11 +105,7 @@ public void ExecuteAfterEventLoopIteration(IRunnable task) Reject(task); } - if (!(task is ILazyRunnable) -#if DEBUG - && WakesUpForTask(task) -#endif - ) + if (!(task is ILazyRunnable) && WakesUpForTask(task)) { WakeUp(InEventLoop); }