From 120e1289bced26584ea0965915ca8b06ab41b04b Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sat, 26 May 2012 13:31:29 +0200 Subject: [PATCH 1/7] use shared thread pool --- .../org/jetbrains/jps/javac/JavacServer.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServer.java b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServer.java index f4dfb849943a..4cb83029243b 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServer.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServer.java @@ -12,13 +12,12 @@ import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder; import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.api.CanceledStatus; +import org.jetbrains.jps.api.SharedThreadPool; import javax.tools.*; import java.io.File; import java.net.InetSocketAddress; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * @author Eugene Zhuravlev @@ -32,11 +31,9 @@ public class JavacServer { private final ChannelGroup myAllOpenChannels = new DefaultChannelGroup("javac-server"); private final ChannelFactory myChannelFactory; private final ChannelPipelineFactory myPipelineFactory; - private ExecutorService myThreadPool; public JavacServer() { - myThreadPool = Executors.newCachedThreadPool(); - myChannelFactory = new NioServerSocketChannelFactory(myThreadPool, myThreadPool, 1); + myChannelFactory = new NioServerSocketChannelFactory(SharedThreadPool.INSTANCE, SharedThreadPool.INSTANCE, 1); final ChannelRegistrar channelRegistrar = new ChannelRegistrar(); final ChannelHandler compilationRequestsHandler = new CompilationRequestsHandler(); myPipelineFactory = new ChannelPipelineFactory() { @@ -198,10 +195,11 @@ public class JavacServer { final CancelHandler cancelHandler = new CancelHandler(); myCancelHandlers.add(cancelHandler); - myThreadPool.submit(new Runnable() { + SharedThreadPool.INSTANCE.submit(new Runnable() { public void run() { try { - final JavacRemoteProto.Message exitMsg = compile(ctx, sessionId, options, files, cp, platformCp, srcPath, outs, cancelHandler); + final JavacRemoteProto.Message exitMsg = + compile(ctx, sessionId, options, files, cp, platformCp, srcPath, outs, cancelHandler); Channels.write(ctx.getChannel(), exitMsg); } finally { @@ -218,10 +216,14 @@ public class JavacServer { cancelBuilds(); new Thread("StopThread") { public void run() { - JavacServer.this.stop(); + try { + JavacServer.this.stop(); + } + finally { + System.exit(0); + } } }.start(); - //System.exit(0); } else { reply = JavacProtoUtil.toMessage(sessionId, JavacProtoUtil.createFailure("Unsupported request type: " + requestType.name(), null)); From 4aee44bd704bd09a8b2243e8f99a456983f0b8c9 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sat, 26 May 2012 13:31:57 +0200 Subject: [PATCH 2/7] cosmetics --- jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java index f90f00941c1f..0ff6160c71d4 100644 --- a/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java +++ b/jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java @@ -846,7 +846,7 @@ public class Mappings { } private class Differential { - final int DESPERATE_MASK = Opcodes.ACC_STATIC | Opcodes.ACC_FINAL; + static final int DESPERATE_MASK = Opcodes.ACC_STATIC | Opcodes.ACC_FINAL; final Mappings myDelta; final Collection myRemoved; From 9251d293d497aa615e7de2b09b6d382c3b29f7bd Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sat, 26 May 2012 14:52:56 +0200 Subject: [PATCH 3/7] do not print spaced lines --- .../src/org/jetbrains/jps/javac/JavacServerBootstrap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServerBootstrap.java b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServerBootstrap.java index f2dc1a82a7f0..a43338c9da3e 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServerBootstrap.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacServerBootstrap.java @@ -93,7 +93,7 @@ public class JavacServerBootstrap { processHandler.addProcessListener(new ProcessAdapter() { public void onTextAvailable(ProcessEvent event, Key outputType) { final String text = event.getText(); - if (!StringUtil.isEmpty(text)) { + if (!StringUtil.isEmptyOrSpaces(text)) { if (outputType == ProcessOutputTypes.STDOUT) { System.out.print("JAVAC_SERVER: " + text); } From 4164cbe3a639f1efa5d455286651d91ce8bb7f9d Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sat, 26 May 2012 18:40:10 +0200 Subject: [PATCH 4/7] generate less garbage --- .../jps/javac/OptimizedFileManager.java | 2 +- .../jps/javac/OptimizedFileManager17.java | 2 +- jps/lib/optimizedFileManager.jar | Bin 18977 -> 19311 bytes .../src/misc/registry.properties | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java index b2f68adccdee..b051dfa52948 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java @@ -110,7 +110,7 @@ class OptimizedFileManager extends DefaultFileManager { private boolean isFile(File root) { Boolean cachedIsFile = myIsFile.get(root); if (cachedIsFile == null) { - cachedIsFile = root.isFile(); + cachedIsFile = Boolean.valueOf(root.isFile()); myIsFile.put(root, cachedIsFile); } return cachedIsFile.booleanValue(); diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java index ec894f6ab35b..d0aad87b2381 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java @@ -164,7 +164,7 @@ class OptimizedFileManager17 extends com.sun.tools.javac.file.JavacFileManager { private boolean isFile(File root) { Boolean cachedIsFile = myIsFile.get(root); if (cachedIsFile == null) { - cachedIsFile = root.isFile(); + cachedIsFile = Boolean.valueOf(root.isFile()); myIsFile.put(root, cachedIsFile); } return cachedIsFile.booleanValue(); diff --git a/jps/lib/optimizedFileManager.jar b/jps/lib/optimizedFileManager.jar index 9765565bf9b7d66e5eca293a41607995fa5e710b..c3726243b6e6dbf8058e7ff90f7a7d81544dda3e 100644 GIT binary patch literal 19311 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 Y(CGkgRyJTZVc-J7OTbjo?gruk03U;kivR!s literal 18977 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 TY`|>7zy*YtfT_aL6~qGo+9;<1 diff --git a/platform/platform-resources-en/src/misc/registry.properties b/platform/platform-resources-en/src/misc/registry.properties index 4a852935c5fa..caa62cbe7a85 100644 --- a/platform/platform-resources-en/src/misc/registry.properties +++ b/platform/platform-resources-en/src/misc/registry.properties @@ -145,7 +145,7 @@ compiler.process.heap.size.description=Heap size value in MB for the build proce compiler.process.32bit.vm.on.mac=true compiler.process.32bit.vm.on.mac.description=Force -d32 VM option on Mac (recommended for faster startup and lower memory footprint) -compiler.process.vm.options=-ea +compiler.process.vm.options= compiler.process.vm.options.description=Additional options for compile server's VM compiler.process.use.memory.temp.cache=true From a957f1703d3a51d9ef6311b3a17064bc80ab35ae Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sat, 26 May 2012 18:46:51 +0200 Subject: [PATCH 5/7] user additional options filtering --- .../jps/incremental/java/JavaBuilder.java | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index 4f15cf5b7152..4a5a56c61dff 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -38,8 +38,7 @@ import org.jetbrains.jps.incremental.storage.BuildDataManager; import org.jetbrains.jps.incremental.storage.SourceToFormMapping; import org.jetbrains.jps.javac.*; -import javax.tools.Diagnostic; -import javax.tools.JavaFileObject; +import javax.tools.*; import java.io.*; import java.net.MalformedURLException; import java.net.ServerSocket; @@ -60,8 +59,14 @@ public class JavaBuilder extends ModuleLevelBuilder { private static final String FORM_EXTENSION = ".form"; public static final boolean USE_EMBEDDED_JAVAC = System.getProperty(GlobalOptions.USE_EXTERNAL_JAVAC_OPTION) == null; private static final Key JAVA_COMPILER_VERSION_KEY = Key.create("_java_compiler_version_"); + private static final Set FILTERED_OPTIONS = new HashSet(Arrays.asList( + "-target" + )); + private static final Set FILTERED_SINGLE_OPTIONS = new HashSet(Arrays.asList( + "-g", "-deprecation", "-nowarn", "-verbose" + )); - public static final FileFilter JAVA_SOURCES_FILTER = new FileFilter() { + private static final FileFilter JAVA_SOURCES_FILTER = new FileFilter() { public boolean accept(File file) { return file.getPath().endsWith(JAVA_EXTENSION); } @@ -726,17 +731,23 @@ public class JavaBuilder extends ModuleLevelBuilder { final String customArgs = javacOpts.get("ADDITIONAL_OPTIONS_STRING"); if (customArgs != null) { - final StringTokenizer tokenizer = new StringTokenizer(customArgs, " \t\r\n"); - while (tokenizer.hasMoreTokens()) { - final String token = tokenizer.nextToken(); - if ("-g".equals(token) || "-deprecation".equals(token) || "-nowarn".equals(token) || "-verbose".equals(token)) { + final StringTokenizer customOptsTokenizer = new StringTokenizer(customArgs, " \t\r\n"); + boolean skip = false; + while (customOptsTokenizer.hasMoreTokens()) { + final String userOption = customOptsTokenizer.nextToken(); + if (FILTERED_OPTIONS.contains(userOption)) { + skip = true; continue; } - if (token.startsWith("-J-")) { - vmOptions.add(token.substring("-J".length())); - } - else { - options.add(token); + if (!skip) { + if (!FILTERED_SINGLE_OPTIONS.contains(userOption)) { + if (userOption.startsWith("-J-")) { + vmOptions.add(userOption.substring("-J".length())); + } + else { + options.add(userOption); + } + } } } } From 1d7689fbe9745d8a2a7df63afaae6381e03ec8c6 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sat, 26 May 2012 19:36:02 +0200 Subject: [PATCH 6/7] logging module name --- .../org/jetbrains/jps/incremental/java/JavaBuilder.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index 4a5a56c61dff..d3b59be07ecb 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -287,8 +287,12 @@ public class JavaBuilder extends ModuleLevelBuilder { final String chunkName = getChunkPresentableName(chunk); context.processMessage(new ProgressMessage("Compiling java [" + chunkName + "]")); - final boolean compiledOk = - files.isEmpty() || compileJava(chunk, files, classpath, platformCp, sourcePath, outs, context, diagnosticSink, outputSink); + final int filesCount = files.size(); + boolean compiledOk = true; + if (filesCount > 0) { + LOG.info("Compiling " + filesCount + " java files; module: " + chunkName); + compiledOk = compileJava(chunk, files, classpath, platformCp, sourcePath, outs, context, diagnosticSink, outputSink); + } context.checkCanceled(); @@ -394,7 +398,6 @@ public class JavaBuilder extends ModuleLevelBuilder { CompileContext context, DiagnosticOutputConsumer diagnosticSink, final OutputFileConsumer outputSink) throws Exception { - LOG.info("Compiling " + files.size() + " java files"); final List options = getCompilationOptions(context, chunk); final ClassProcessingConsumer classesConsumer = new ClassProcessingConsumer(context, outputSink); try { From e67903a6785bff0c6b12fbb0fe700b1fbce53f8e Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sat, 26 May 2012 19:37:53 +0200 Subject: [PATCH 7/7] default heap size --- platform/platform-resources-en/src/misc/registry.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-resources-en/src/misc/registry.properties b/platform/platform-resources-en/src/misc/registry.properties index caa62cbe7a85..3b2ec5dbe19b 100644 --- a/platform/platform-resources-en/src/misc/registry.properties +++ b/platform/platform-resources-en/src/misc/registry.properties @@ -139,7 +139,7 @@ compiler.out-of-process.build.enabled.description=Enable out-of-process compilat compiler.out-of-process.as-server=false compiler.out-of-process.as-server.description=Use implementation of out-of-process build as server process -compiler.process.heap.size=600 +compiler.process.heap.size=700 compiler.process.heap.size.description=Heap size value in MB for the build process compiler.process.32bit.vm.on.mac=true