Reviewers: scottb, jat, conroy, fabbott,

Description:
Adds a hack to pre-initialize the Java Graphics2D library.
I've noted varying times to make the first call to grab a Graphics2D
object, ranging from 200ms to 6s.  This runs the first call in a thread.



Please review this at http://gwt-code-reviews.appspot.com/822801/show

Affected files:
  M dev/core/src/com/google/gwt/dev/Precompile.java
  M user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
  M user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java


Index: dev/core/src/com/google/gwt/dev/Precompile.java
===================================================================
--- dev/core/src/com/google/gwt/dev/Precompile.java     (revision 8677)
+++ dev/core/src/com/google/gwt/dev/Precompile.java     (working copy)
@@ -72,6 +72,8 @@
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;

+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -372,11 +374,31 @@
   }

   /**
+ * Creates a Graphics2D context in a thread in order to go ahead and get first + * time initialization out of the way. Delays ranging from 200ms to 6s have
+   * been observed when initializing the library.
+   */
+  private static class GraphicsInitThread extends Thread {
+    public void run() {
+ SpeedTracerLogger.Event createGraphicsEvent = SpeedTracerLogger.start(
+          CompilerEventType.GRAPHICS_INIT, "java.awt.headless",
+          System.getProperty("java.awt.headless"));
+      BufferedImage image = new BufferedImage(
+          16, 16, BufferedImage.TYPE_INT_ARGB_PRE);
+      Graphics2D g2d = image.createGraphics();
+      g2d.dispose();
+      createGraphicsEvent.end();
+    }
+  };
+
+  /**
    * The file name for the result of Precompile.
    */
   public static final String PRECOMPILE_FILENAME = "precompilation.ser";

   static final String PERM_COUNT_FILENAME = "permCount.txt";
+
+  private static Thread graphicsInitThread = new GraphicsInitThread();

   /**
    * Performs a command-line precompile.
@@ -498,6 +520,13 @@
PropertyPermutations allPermutations, File genDir, File dumpSignatureFile) {

Event precompileEvent = SpeedTracerLogger.start(CompilerEventType.PRECOMPILE);
+
+ // This initializes the Java2D library in a thread so that the main program
+    // doesn't block when the library is accessed for the first time.
+ // We don't care if the program finishes before the initialization ends.
+    graphicsInitThread.setDaemon(true);
+    graphicsInitThread.start();
+
     try {
CompilationState compilationState = module.getCompilationState(logger);
       if (dumpSignatureFile != null) {
Index: user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
===================================================================
--- user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java (revision 8677) +++ user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java (working copy)
@@ -533,7 +533,8 @@
         rect.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);

     SpeedTracerLogger.Event createGraphicsEvent =
-      SpeedTracerLogger.start(CompilerEventType.GRAPHICS_INIT);
+      SpeedTracerLogger.start(CompilerEventType.GRAPHICS_INIT,
+          "java.awt.headless", System.getProperty("java.awt.headless"));
     Graphics2D g2d = bundledImage.createGraphics();
     createGraphicsEvent.end();

@@ -808,7 +809,8 @@
     BufferedImage bundledImage = new BufferedImage(size.width, size.height,
         BufferedImage.TYPE_INT_ARGB_PRE);

- SpeedTracerLogger.Event graphicsEvent = SpeedTracerLogger.start(CompilerEventType.GRAPHICS_INIT); + SpeedTracerLogger.Event graphicsEvent = SpeedTracerLogger.start(CompilerEventType.GRAPHICS_INIT,
+        "java.awt.headless", System.getProperty("java.awt.headless"));
     Graphics2D g2d = bundledImage.createGraphics();
     graphicsEvent.end();

Index: user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java
===================================================================
--- user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java (revision 8677) +++ user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java (working copy)
@@ -450,7 +450,8 @@
     BufferedImage bundledImage = new BufferedImage(size.width, size.height,
         BufferedImage.TYPE_INT_ARGB_PRE);
     SpeedTracerLogger.Event createGraphicsEvent =
-      SpeedTracerLogger.start(CompilerEventType.GRAPHICS_INIT);
+      SpeedTracerLogger.start(CompilerEventType.GRAPHICS_INIT,
+          "java.awt.headless", System.getProperty("java.awt.headless"));
     Graphics2D g2d = bundledImage.createGraphics();
     createGraphicsEvent.end();



--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to