From 4c8818910ead12aa044e373bb7318d9eb5ac85bb Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 1 Dec 2017 12:10:42 +0300 Subject: [PATCH] organize "Javac server event loop" threads in pool and wait for their termination By default Netty just creates threads light and right and abandons them (see io.netty.util.concurrent.ThreadPerTaskExecutor WTF?) --- .../org/jetbrains/jps/javac/ExternalJavacManager.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/ExternalJavacManager.java b/jps/jps-builders/src/org/jetbrains/jps/javac/ExternalJavacManager.java index 28ebccb596d0..b06a478e91d9 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/ExternalJavacManager.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/ExternalJavacManager.java @@ -50,6 +50,7 @@ import java.io.File; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -72,6 +73,7 @@ public class ExternalJavacManager { private final Map myMessageHandlers = new HashMap<>(); private int myListenPort = DEFAULT_SERVER_PORT; private final Set myRunningHandlers = ContainerUtil.newConcurrentSet(); + private final ThreadPoolExecutor myExecutor = ConcurrencyUtil.newSingleThreadExecutor("Javac server event loop pool"); public ExternalJavacManager(@NotNull final File workingDir) { myWorkingDir = workingDir; @@ -81,7 +83,7 @@ public class ExternalJavacManager { public void start(int listenPort) { final ChannelHandler compilationRequestsHandler = new CompilationRequestsHandler(); final ServerBootstrap bootstrap = new ServerBootstrap() - .group(new NioEventLoopGroup(1, ConcurrencyUtil.newNamedThreadFactory("Javac server event loop"))) + .group(new NioEventLoopGroup(1, myExecutor)) .channel(NioServerSocketChannel.class) .childOption(ChannelOption.TCP_NODELAY, true) .childOption(ChannelOption.SO_KEEPALIVE, true) @@ -187,6 +189,12 @@ public class ExternalJavacManager { if (!handler.waitFor(unit.toMillis(time))) { return false; } + } + try { + myExecutor.awaitTermination(time, unit); + } + catch (InterruptedException ignored) { + } return true; } @@ -209,6 +217,7 @@ public class ExternalJavacManager { public void stop() { myChannelRegistrar.close().awaitUninterruptibly(); + myExecutor.shutdownNow(); } private ExternalJavacProcessHandler launchExternalJavacProcess(UUID uuid,