Cleanup (arrangement; aggressive logging)

This commit is contained in:
Roman Shevchenko
2014-04-30 13:37:48 +04:00
parent d3d0f7382d
commit 901e60d827
2 changed files with 103 additions and 102 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2013 JetBrains s.r.o.
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.SmartList;
import com.intellij.util.containers.HashMap;
import com.intellij.util.containers.Stack;
import org.jetbrains.annotations.NonNls;
import com.intellij.util.io.URLUtil;
import org.jetbrains.annotations.Nullable;
import sun.misc.Resource;
@@ -35,76 +35,20 @@ import java.net.URL;
import java.util.*;
public class ClassPath {
private final Stack<URL> myUrls = new Stack<URL>();
private final ArrayList<Loader> myLoaders = new ArrayList<Loader>();
private final HashMap<URL,Loader> myLoadersMap = new HashMap<URL, Loader>();
private final ClasspathCache myCache = new ClasspathCache();
private static final ResourceStringLoaderIterator ourCheckedIterator = new ResourceStringLoaderIterator(true);
private static final ResourceStringLoaderIterator ourUncheckedIterator = new ResourceStringLoaderIterator(false);
private static final LoaderCollector ourLoaderCollector = new LoaderCollector();
@NonNls private static final String FILE_PROTOCOL = "file";
private static final boolean myDebugTime = false;
private static final boolean ourDumpOrder = "true".equals(System.getProperty("idea.dump.order"));
// private static final boolean ourPreloadClasses = "true".equals(System.getProperty("idea.preload.classes"));
private final Stack<URL> myUrls = new Stack<URL>();
private final List<Loader> myLoaders = new ArrayList<Loader>();
private final Map<URL, Loader> myLoadersMap = new HashMap<URL, Loader>();
private final ClasspathCache myCache = new ClasspathCache();
private final boolean myCanLockJars;
private final boolean myCanUseCache;
private static final long NS_THRESHOLD = 10000000L;
private static long total;
private static int requests;
private static PrintStream ourOrder;
private static long ourOrderSize;
private static final Set<String> ourOrderedUrls = new HashSet<String>();
private final boolean myAcceptUnescapedUrls;
private final boolean myPreloadJarContents;
private static synchronized void printOrder(Loader loader, String url, Resource resource) {
if (!ourOrderedUrls.add(url)) return;
String home = FileUtil.toSystemIndependentName(PathManager.getHomePath());
try {
ourOrderSize += resource.getContentLength();
}
catch (IOException e) {
System.out.println(e);
}
if (ourOrder == null) {
final File orderFile = new File(PathManager.getBinPath() + File.separator + "order.txt");
try {
if (!FileUtil.ensureCanCreateFile(orderFile)) return;
ourOrder = new PrintStream(new FileOutputStream(orderFile, true));
ShutDownTracker.getInstance().registerShutdownTask(new Runnable() {
public void run() {
ourOrder.close();
System.out.println(ourOrderSize);
}
});
}
catch (IOException e) {
return;
}
}
if (ourOrder != null) {
String jarURL = FileUtil.toSystemIndependentName(loader.getBaseURL().getFile());
jarURL = StringUtil.trimStart(jarURL, "file:/");
if (jarURL.startsWith(home)) {
jarURL = jarURL.replaceFirst(home, "");
jarURL = StringUtil.trimEnd(jarURL, "!/");
ourOrder.println(url + ":" + jarURL);
}
}
}
/** @deprecated use {@link #ClassPath(java.util.List, boolean, boolean, boolean, boolean)} (to remove in IDEA 14) */
public ClassPath(URL[] urls, boolean canLockJars, boolean canUseCache) {
this(Arrays.asList(urls), canLockJars, canUseCache, false, true);
}
/** @deprecated use {@link #ClassPath(java.util.List, boolean, boolean, boolean, boolean)} (to remove in IDEA 14) */
public ClassPath(URL[] urls, boolean canLockJars, boolean canUseCache, boolean acceptUnescapedUrls, boolean preloadJarContents) {
this(Arrays.asList(urls), canLockJars, canUseCache, acceptUnescapedUrls, preloadJarContents);
}
public ClassPath(List<URL> urls, boolean canLockJars, boolean canUseCache, boolean acceptUnescapedUrls, boolean preloadJarContents) {
myCanLockJars = canLockJars;
myCanUseCache = canUseCache;
@@ -130,12 +74,11 @@ public class ClassPath {
@Nullable
public Resource getResource(String s, boolean flag) {
final long started = myDebugTime ? System.nanoTime():0;
final long started = startTiming();
try {
int i;
if (myCanUseCache) {
Resource prevResource = myCache.iterateLoaders(s, flag ? checkedIterator:uncheckedIterator, s, this);
Resource prevResource = myCache.iterateLoaders(s, flag ? ourCheckedIterator : ourUncheckedIterator, s, this);
if (prevResource != null) return prevResource;
synchronized (myUrls) {
@@ -148,7 +91,8 @@ public class ClassPath {
i = 0;
}
for (Loader loader; (loader = getLoader(i)) != null; i++) {
Loader loader;
while ((loader = getLoader(i++)) != null) {
if (myCanUseCache) {
if (!myCache.loaderHasName(s, loader)) continue;
}
@@ -157,12 +101,12 @@ public class ClassPath {
return resource;
}
}
return null;
}
finally {
if (myDebugTime) reportTime(started, s);
logTiming(this, started, s);
}
return null;
}
public Enumeration<URL> getResources(final String name, final boolean check) {
@@ -207,20 +151,24 @@ public class ClassPath {
@Nullable
private Loader getLoader(final URL url, int index) throws IOException {
String s;
if (myAcceptUnescapedUrls) {
s = url.getFile();
} else {
}
else {
try {
s = url.toURI().getSchemeSpecificPart();
} catch (URISyntaxException thisShouldNotHappen) {
}
catch (URISyntaxException thisShouldNotHappen) {
//noinspection CallToPrintStackTrace
thisShouldNotHappen.printStackTrace();
s = url.getFile();
}
}
Loader loader = null;
if (s != null && new File(s).isDirectory()) {
if (FILE_PROTOCOL.equals(url.getProtocol())) {
if (s != null && new File(s).isDirectory()) {
if (URLUtil.FILE_PROTOCOL.equals(url.getProtocol())) {
loader = new FileLoader(url, index);
}
}
@@ -260,9 +208,9 @@ public class ClassPath {
synchronized (myUrls) {
if (myUrls.isEmpty()) {
loaders = new SmartList<Loader>();
myCache.iterateLoaders(name, myLoaderCollector, loaders, this);
myCache.iterateLoaders(name, ourLoaderCollector, loaders, this);
if (!name.endsWith("/")) {
myCache.iterateLoaders(name.concat("/"), myLoaderCollector, loaders, this);
myCache.iterateLoaders(name.concat("/"), ourLoaderCollector, loaders, this);
}
}
}
@@ -273,9 +221,10 @@ public class ClassPath {
private boolean next() {
if (myRes != null) return true;
long started = myDebugTime ? System.nanoTime() : 0;
Loader loader;
long started = startTiming();
try {
Loader loader;
if (myLoaders != null) {
while (myIndex < myLoaders.size()) {
loader = myLoaders.get(myIndex++);
@@ -296,10 +245,9 @@ public class ClassPath {
}
}
finally {
if (myDebugTime) reportTime(started, myName);
logTiming(ClassPath.this, started, myName);
}
return false;
}
@@ -319,18 +267,6 @@ public class ClassPath {
}
}
private void reportTime(long started, String msg) {
long doneFor = System.nanoTime() - started;
total += doneFor;
++requests;
if (doneFor > NS_THRESHOLD) {
System.out.println((doneFor/1000000) + " ms for " +msg);
}
if (requests % 1000 == 0) {
System.out.println(toString() + ", requests:" + requests + ", time:" + (total / 1000000) + "ms");
}
}
private static class ResourceStringLoaderIterator extends ClasspathCache.LoaderIterator<Resource, String, ClassPath> {
private final boolean myFlag;
@@ -343,17 +279,12 @@ public class ClassPath {
if (!classPath.myCache.loaderHasName(s, loader)) return null;
final Resource resource = loader.getResource(s, myFlag);
if (resource != null) {
if (ourDumpOrder) {
printOrder(loader, s, resource);
}
printOrder(loader, s, resource);
return resource;
}
return null;
}
}
private static final ResourceStringLoaderIterator checkedIterator = new ResourceStringLoaderIterator(true);
private static final ResourceStringLoaderIterator uncheckedIterator = new ResourceStringLoaderIterator(false);
private static final LoaderCollector myLoaderCollector = new LoaderCollector();
private static class LoaderCollector extends ClasspathCache.LoaderIterator<Object, List<Loader>, Object> {
@Override
@@ -362,4 +293,74 @@ public class ClassPath {
return null;
}
}
private static final boolean ourDumpOrder = "true".equals(System.getProperty("idea.dump.order"));
private static PrintStream ourOrder;
private static long ourOrderSize;
private static final Set<String> ourOrderedUrls = new HashSet<String>();
@SuppressWarnings("UseOfSystemOutOrSystemErr")
private static synchronized void printOrder(Loader loader, String url, Resource resource) {
if (!ourDumpOrder) return;
if (!ourOrderedUrls.add(url)) return;
String home = FileUtil.toSystemIndependentName(PathManager.getHomePath());
try {
ourOrderSize += resource.getContentLength();
}
catch (IOException e) {
e.printStackTrace(System.out);
}
if (ourOrder == null) {
final File orderFile = new File(PathManager.getBinPath() + File.separator + "order.txt");
try {
if (!FileUtil.ensureCanCreateFile(orderFile)) return;
ourOrder = new PrintStream(new FileOutputStream(orderFile, true));
ShutDownTracker.getInstance().registerShutdownTask(new Runnable() {
public void run() {
ourOrder.close();
System.out.println(ourOrderSize);
}
});
}
catch (IOException e) {
return;
}
}
if (ourOrder != null) {
String jarURL = FileUtil.toSystemIndependentName(loader.getBaseURL().getFile());
jarURL = StringUtil.trimStart(jarURL, "file:/");
if (jarURL.startsWith(home)) {
jarURL = jarURL.replaceFirst(home, "");
jarURL = StringUtil.trimEnd(jarURL, "!/");
ourOrder.println(url + ":" + jarURL);
}
}
}
private static final boolean ourLogTiming = Boolean.getBoolean("idea.print.classpath.timing");
private static long ourTotalTime = 0;
private static int ourTotalRequests = 0;
private static long startTiming() {
return ourLogTiming ? System.nanoTime() : 0;
}
@SuppressWarnings("UseOfSystemOutOrSystemErr")
private static void logTiming(ClassPath path, long started, String msg) {
if (!ourLogTiming) return;
long time = System.nanoTime() - started;
ourTotalTime += time;
++ourTotalRequests;
if (time > 10000000L) {
System.out.println((time / 1000000) + " ms for " + msg);
}
if (ourTotalRequests % 1000 == 0) {
System.out.println(path.toString() + ", requests:" + ourTotalRequests + ", time:" + (ourTotalTime / 1000000) + "ms");
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2012 JetBrains s.r.o.
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,7 +32,7 @@ import static org.junit.Assert.*;
/**
* @author Dmitry Avdeev
* @since 7/12/11
* @since 12/07/2011
*/
public class ReorderJarsTest {
private File myTempDirectory;