From 32e88beef6132ccef6a98a83889b30b82c353fad Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 4 Jul 2012 15:54:46 +0200 Subject: [PATCH] revert: use optimized file managers in single-threaded environment only --- .../org/jetbrains/jps/javac/JavacMain.java | 24 +++--- .../jps/javac/OptimizedFileManager.java | 10 +-- .../jps/javac/OptimizedFileManager17.java | 69 +----------------- jps/lib/optimizedFileManager.jar | Bin 22515 -> 20217 bytes 4 files changed, 21 insertions(+), 82 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java index fd322576c447..c2a82ab975cc 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java @@ -16,6 +16,7 @@ import java.util.*; */ public class JavacMain { private static final boolean IS_VM_6_VERSION = System.getProperty("java.version", "1.6").contains("1.6"); + private static final boolean ECLIPSE_COMPILER_SINGLE_THREADED_MODE = Boolean.parseBoolean(System.getProperty("jdt.compiler.useSingleThread", "false")); private static final Set FILTERED_OPTIONS = new HashSet(Arrays.asList( "-d", "-classpath", "-cp", "-bootclasspath" )); @@ -58,7 +59,8 @@ public class JavacMain { for (File outputDir : outputDirToRoots.keySet()) { outputDir.mkdirs(); } - final JavacFileManager fileManager = new JavacFileManager(new ContextImpl(compiler, outConsumer, outputSink, canceledStatus)); + final boolean canUseOptimizedmanager = nowUsingJavac || ECLIPSE_COMPILER_SINGLE_THREADED_MODE; + final JavacFileManager fileManager = new JavacFileManager(new ContextImpl(compiler, outConsumer, outputSink, canceledStatus, canUseOptimizedmanager)); fileManager.handleOption("-bootclasspath", Collections.singleton("").iterator()); // this will clear cached stuff fileManager.handleOption("-extdirs", Collections.singleton("").iterator()); // this will clear cached stuff @@ -173,19 +175,21 @@ public class JavacMain { public ContextImpl(@NotNull JavaCompiler compiler, @NotNull DiagnosticOutputConsumer outConsumer, @NotNull OutputFileConsumer sink, - CanceledStatus canceledStatus) { + CanceledStatus canceledStatus, boolean canUseOptimizedmanager) { myOutConsumer = outConsumer; myOutputFileSink = sink; myCanceledStatus = canceledStatus; StandardJavaFileManager stdManager = null; - final Class optimizedManagerClass = ClasspathBootstrap.getOptimizedFileManagerClass(); - if (optimizedManagerClass != null) { - try { - stdManager = optimizedManagerClass.newInstance(); - } - catch (Throwable e) { - if (SystemInfo.isWindows) { - System.err.println("Failed to load JPS optimized file manager for javac: " + e.getMessage()); + if (canUseOptimizedmanager) { + final Class optimizedManagerClass = ClasspathBootstrap.getOptimizedFileManagerClass(); + if (optimizedManagerClass != null) { + try { + stdManager = optimizedManagerClass.newInstance(); + } + catch (Throwable e) { + if (SystemInfo.isWindows) { + System.err.println("Failed to load JPS optimized file manager for javac: " + e.getMessage()); + } } } } 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 18217abca394..fffb1c995ca5 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager.java @@ -6,8 +6,7 @@ import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.List; import javax.lang.model.SourceVersion; -import javax.tools.FileObject; -import javax.tools.JavaFileObject; +import javax.tools.*; import java.io.*; import java.lang.ref.SoftReference; import java.lang.reflect.Field; @@ -17,7 +16,6 @@ import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.*; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; /** @@ -29,9 +27,9 @@ import java.util.concurrent.atomic.AtomicReference; class OptimizedFileManager extends DefaultFileManager { private boolean myUseZipFileIndex; private final Map myArchives; - private final Map myIsFile = new ConcurrentHashMap(); - private final Map> myContentCache = new ConcurrentHashMap>(); - private final Map myDirectoryCache = new ConcurrentHashMap(); + private final Map myIsFile = new HashMap(); + private final Map> myContentCache = new HashMap>(); + private final Map myDirectoryCache = new HashMap(); public static final File[] NULL_FILE_ARRAY = new File[0]; public OptimizedFileManager() throws Throwable { 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 af04f6c37f17..7c024371d9a8 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/OptimizedFileManager17.java @@ -8,7 +8,7 @@ import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import javax.lang.model.SourceVersion; -import javax.tools.JavaFileObject; +import javax.tools.*; import java.io.*; import java.lang.ref.Reference; import java.lang.ref.SoftReference; @@ -18,8 +18,6 @@ import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharsetDecoder; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicReference; /** * WARNING: Loaded via reflection, do not delete @@ -29,10 +27,9 @@ import java.util.concurrent.atomic.AtomicReference; class OptimizedFileManager17 extends com.sun.tools.javac.file.JavacFileManager { private boolean myUseZipFileIndex; private final Map myArchives; - private final Map myIsFile = new ConcurrentHashMap(); - private final Map myDirectoryCache = new ConcurrentHashMap(); + private final Map myIsFile = new HashMap(); + private final Map myDirectoryCache = new HashMap(); public static final File[] NULL_FILE_ARRAY = new File[0]; - private final Map> myContentCache = new ConcurrentHashMap>(); public OptimizedFileManager17() throws Throwable { super(new Context(), true, null); @@ -199,66 +196,6 @@ class OptimizedFileManager17 extends com.sun.tools.javac.file.JavacFileManager { return fileKinds.contains(getKind(name)); } - public CharBuffer getCachedContent(JavaFileObject file) { - final SoftReference r = myContentCache.get(file); - return r == null ? null : r.get(); - } - - public void cache(JavaFileObject file, CharBuffer cb) { - myContentCache.put(file, new SoftReference(cb)); - } - - public void flush() { - try { - super.flush(); - } - finally { - myContentCache.clear(); - } - } - - public ByteBuffer makeByteBuffer(InputStream in) throws IOException { - int limit = in.available(); - if (limit < 1024) { - limit = 1024; - } - ByteBuffer result = myByteBufferCache.get(limit); - int position = 0; - while (in.available() != 0) { - if (position >= limit) { - // expand buffer - result = ByteBuffer.allocate(limit <<= 1).put((ByteBuffer)result.flip()); - } - final int count = in.read(result.array(), position, limit - position); - if (count < 0) { - break; - } - result.position(position += count); - } - return (ByteBuffer)result.flip(); - } - - public void recycleByteBuffer(ByteBuffer bb) { - myByteBufferCache.put(bb); - } - - private static class ByteBufferCache { - private AtomicReference myCached = new AtomicReference(null); - - ByteBuffer get(int capacity) { - if (capacity < 20480) { - capacity = 20480; - } - final ByteBuffer cached = myCached.getAndSet(null); - return (cached != null && cached.capacity() >= capacity) ? (ByteBuffer)cached.clear() : ByteBuffer.allocate(capacity + capacity>>1); - } - - void put(ByteBuffer x) { - myCached.set(x); - } - } - private final ByteBufferCache myByteBufferCache = new ByteBufferCache(); - private class InputFileObject extends BaseFileObject { private String name; final File file; diff --git a/jps/lib/optimizedFileManager.jar b/jps/lib/optimizedFileManager.jar index abf36a723c988df17b96e948e4c3207f4fe2fc16..8d33b1862e1dcbad6aa992747a57f4c08e932889 100644 GIT binary patch delta 13503 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 PpYsk91ms%jKi2;PdsZI{