From 4fca0447dd8bd0395052825a19fef543d321e60f Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 19 Sep 2016 14:51:36 +0200 Subject: [PATCH] improve shutdown of TaskRunner, #21430 * important that no tasks are run after shutdown * could be a reason for segfault --- .../scala/akka/remote/artery/TaskRunner.scala | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/akka-remote/src/main/scala/akka/remote/artery/TaskRunner.scala b/akka-remote/src/main/scala/akka/remote/artery/TaskRunner.scala index e3f093e0f6..1f6ca158d4 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/TaskRunner.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/TaskRunner.scala @@ -63,6 +63,14 @@ private[akka] object TaskRunner { tryRemove(0) } + def removeAll(): Unit = { + var i = 0 + while (i < elements.length) { + elements(i) = null.asInstanceOf[T] + i += 1 + } + } + /** * All elements as an array for efficient iteration. * The elements can be `null`. @@ -138,12 +146,14 @@ private[akka] class TaskRunner(system: ExtendedActorSystem, val idleCpuLevel: In running = true while (running) { processCommand(cmdQueue.poll()) - executeTasks() - if (reset) { - reset = false - idleStrategy.reset() + if (running) { + executeTasks() + if (reset) { + reset = false + idleStrategy.reset() + } + idleStrategy.idle() } - idleStrategy.idle() } } catch { case NonFatal(e) ⇒ @@ -178,6 +188,8 @@ private[akka] class TaskRunner(system: ExtendedActorSystem, val idleCpuLevel: In case Remove(task) ⇒ tasks.remove(task) case Shutdown ⇒ running = false + tasks.removeAll() // gc friendly + while (cmdQueue.poll() != null) () // gc friendly shutdown.trySuccess(Done) } }