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
-~----------~----~----~----~------~----~------~--~---

Reply via email to