Author: sco...@google.com Date: Tue Mar 31 09:51:00 2009 New Revision: 5132
Modified: changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/SyntheticArtifact.java changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardCompilationResult.java changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java changes/scottb/memory/dev/core/src/com/google/gwt/dev/util/DiskCache.java Log: Make Link run faster and use less heap Modified: changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java ============================================================================== --- changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java (original) +++ changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java Tue Mar 31 09:51:00 2009 @@ -65,11 +65,7 @@ @Override public final int hashCode() { - int hash = 17; - for (String js : getJavaScript()) { - hash = hash * 37 + js.hashCode(); - } - return hash; + return getStrongName().hashCode(); } @Override Modified: changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/SyntheticArtifact.java ============================================================================== --- changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/SyntheticArtifact.java (original) +++ changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/SyntheticArtifact.java Tue Mar 31 09:51:00 2009 @@ -18,52 +18,37 @@ import com.google.gwt.core.ext.Linker; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; -import com.google.gwt.dev.util.Util; +import com.google.gwt.dev.util.DiskCache; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; +import java.io.ByteArrayInputStream; import java.io.InputStream; /** * Artifacts created by {...@link AbstractLinker}. */ public class SyntheticArtifact extends EmittedArtifact { - private final File backing; + private static final DiskCache diskCache = new DiskCache(); + private final long lastModified; + private final long token; SyntheticArtifact(TreeLogger logger, Class<? extends Linker> linkerType, - String partialPath, byte[] data) throws UnableToCompleteException { + String partialPath, byte[] data) { this(logger, linkerType, partialPath, data, System.currentTimeMillis()); } - SyntheticArtifact(TreeLogger logger, Class<? extends Linker> linkerType, String partialPath, - byte[] data, long lastModified) throws UnableToCompleteException { + SyntheticArtifact(TreeLogger logger, Class<? extends Linker> linkerType, + String partialPath, byte[] data, long lastModified) { super(linkerType, partialPath); assert data != null; - - try { - backing = File.createTempFile("synthetic", ".artifact"); - backing.deleteOnExit(); - Util.writeBytesToFile(TreeLogger.NULL, backing, data); - } catch (IOException e) { - logger.log(TreeLogger.ERROR, "Unable to write backing file for artifact " - + partialPath, e); - throw new UnableToCompleteException(); - } this.lastModified = lastModified; + this.token = diskCache.writeByteArray(data); } @Override public InputStream getContents(TreeLogger logger) throws UnableToCompleteException { - try { - return new FileInputStream(backing); - } catch (IOException e) { - logger.log(TreeLogger.ERROR, "Unable to read backing file for artifact " - + getPartialPath(), e); - throw new UnableToCompleteException(); - } + return new ByteArrayInputStream(diskCache.readByteArray(token)); } @Override Modified: changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardCompilationResult.java ============================================================================== --- changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardCompilationResult.java (original) +++ changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardCompilationResult.java Tue Mar 31 09:51:00 2009 @@ -15,16 +15,12 @@ */ package com.google.gwt.core.ext.linker.impl; -import com.google.gwt.core.ext.TreeLogger; -import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.linker.CompilationResult; import com.google.gwt.core.ext.linker.SelectionProperty; import com.google.gwt.core.ext.linker.SymbolData; -import com.google.gwt.dev.PermutationResult; -import com.google.gwt.dev.util.FileBackedObject; +import com.google.gwt.dev.util.DiskCache; import java.io.Serializable; -import java.lang.ref.SoftReference; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; @@ -71,22 +67,23 @@ */ public static final Comparator<SortedMap<SelectionProperty, String>> MAP_COMPARATOR = new MapComparator(); - private transient SoftReference<String[]> js; + private static final DiskCache diskCache = new DiskCache(); - private final FileBackedObject<PermutationResult> resultFile; - - private transient SoftReference<SortedMap<SymbolData, String>> symbolMap; + private final long jsToken; private final SortedSet<SortedMap<SelectionProperty, String>> propertyValues = new TreeSet<SortedMap<SelectionProperty, String>>( MAP_COMPARATOR); + private final String strongName; - public StandardCompilationResult(String[] js, String strongName, - FileBackedObject<PermutationResult> resultFile) { + private final long symbolMapToken; + + public StandardCompilationResult(String strongName, String[] js, + SortedMap<SymbolData, String> symbolMap) { super(StandardLinkerContext.class); - this.js = new SoftReference<String[]>(js); this.strongName = strongName; - this.resultFile = resultFile; + jsToken = diskCache.writeObject(js); + symbolMapToken = diskCache.writeObject(symbolMap); } /** @@ -102,18 +99,7 @@ @Override public String[] getJavaScript() { - String[] toReturn = null; - if (js != null) { - toReturn = js.get(); - } - - if (toReturn == null) { - PermutationResult result = loadPermutationResult(); - toReturn = result.getJs(); - js = new SoftReference<String[]>(toReturn); - } - - return toReturn; + return (String[]) diskCache.readObject(jsToken); } @Override @@ -127,27 +113,8 @@ } @Override + @SuppressWarnings("unchecked") public SortedMap<SymbolData, String> getSymbolMap() { - SortedMap<SymbolData, String> toReturn = null; - if (symbolMap != null) { - toReturn = symbolMap.get(); - } - - if (toReturn == null) { - PermutationResult result = loadPermutationResult(); - toReturn = result.getSymbolMap(); - symbolMap = new SoftReference<SortedMap<SymbolData, String>>(toReturn); - } - - return toReturn; - } - - private PermutationResult loadPermutationResult() { - try { - return resultFile.newInstance(TreeLogger.NULL); - } catch (UnableToCompleteException e) { - throw new RuntimeException( - "Unexpectedly unable to read PermutationResult"); - } + return (SortedMap<SymbolData, String>) diskCache.readObject(symbolMapToken); } } Modified: changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java ============================================================================== --- changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java (original) +++ changes/scottb/memory/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java Tue Mar 31 09:51:00 2009 @@ -269,10 +269,13 @@ FileBackedObject<PermutationResult> resultFile) throws UnableToCompleteException { PermutationResult permutationResult = resultFile.newInstance(logger); - String strongName = Util.computeStrongName(Util.getBytes(permutationResult.getJs())); + + String[] js = permutationResult.getJs(); + String strongName = Util.computeStrongName(Util.getBytes(js)); StandardCompilationResult result = resultsByStrongName.get(strongName); if (result == null) { - result = new StandardCompilationResult(null, strongName, resultFile); + result = new StandardCompilationResult(strongName, js, + permutationResult.getSymbolMap()); resultsByStrongName.put(result.getStrongName(), result); artifacts.add(result); Modified: changes/scottb/memory/dev/core/src/com/google/gwt/dev/util/DiskCache.java ============================================================================== --- changes/scottb/memory/dev/core/src/com/google/gwt/dev/util/DiskCache.java (original) +++ changes/scottb/memory/dev/core/src/com/google/gwt/dev/util/DiskCache.java Tue Mar 31 09:51:00 2009 @@ -15,8 +15,14 @@ */ package com.google.gwt.dev.util; +import com.google.gwt.util.tools.Utility; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.List; @@ -77,6 +83,25 @@ } } + public Object readObject(long token) { + byte[] bytes = readByteArray(token); + // TODO(MERGE): use the version in Util in trunk. + ObjectInputStream objectInputStream = null; + try { + ByteArrayInputStream in = new ByteArrayInputStream(bytes); + objectInputStream = new ObjectInputStream(in); + return objectInputStream.readObject(); + } catch (ClassNotFoundException e) { + throw new RuntimeException( + "Unexpected exception deserializing from disk cache", e); + } catch (IOException e) { + throw new RuntimeException("Unexpected IOException on in-memory stream", + e); + } finally { + Utility.close(objectInputStream); + } + } + /** * Read a String from disk. * @@ -103,6 +128,22 @@ return position; } catch (IOException e) { throw new RuntimeException("Unable to initialize byte cache", e); + } + } + + public long writeObject(Object object) { + // TODO(MERGE): use the version in Util in trunk. + ObjectOutputStream objectStream = null; + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + objectStream = new ObjectOutputStream(out); + objectStream.writeObject(object); + Utility.close(objectStream); + objectStream = null; + return writeByteArray(out.toByteArray()); + } catch (IOException e) { + throw new RuntimeException("Unexpected IOException on in-memory stream", + e); } } --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---