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