Revision: 8437
Author: [email protected]
Date: Thu Jul 29 04:13:58 2010
Log: - Refactors SpeedTracerLogger so that the start() and stop() methods
are static
- Adds a new addData() method to annotate the current event with more data.
- Updates lists to use com.google.gwt.dev.util.collect.Lists;
- Reduces visibility of methods only used for unit testing
- Migrates the unit class to the same package as SpeedTracerLogger
Review at http://gwt-code-reviews.appspot.com/719801
http://code.google.com/p/google-web-toolkit/source/detail?r=8437
Added:
/trunk/dev/core/test/com/google/gwt/dev/util/log/speedtracer
/trunk/dev/core/test/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLoggerTest.java
Deleted:
/trunk/dev/core/test/com/google/gwt/dev/util/log/SpeedTracerLoggerTest.java
Modified:
/trunk/dev/core/src/com/google/gwt/dev/Compiler.java
/trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java
/trunk/dev/core/src/com/google/gwt/dev/Precompile.java
/trunk/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
/trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
/trunk/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java
/trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
/trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
/trunk/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java
/trunk/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
/trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java
=======================================
--- /dev/null
+++
/trunk/dev/core/test/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLoggerTest.java
Thu Jul 29 04:13:58 2010
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
not
+ * use this file except in compliance with the License. You may obtain a
copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
under
+ * the License.
+ */
+package com.google.gwt.dev.util.log.speedtracer;
+
+import com.google.gwt.dev.json.JsonArray;
+import com.google.gwt.dev.json.JsonException;
+import com.google.gwt.dev.json.JsonObject;
+import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.EventType;
+
+import junit.framework.TestCase;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+
+/**
+ * Tests the SpeedTracerLogger class.
+ */
+public class SpeedTracerLoggerTest extends TestCase {
+ private static class DummyEventType implements EventType {
+ private final String color;
+ private final String name;
+
+ public DummyEventType(String name, String color) {
+ this.name = name;
+ this.color = color;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public String getName() {
+ return name;
+ }
+ }
+ private class TestLoggerThreadedThread extends Thread {
+
+ private final EventType event;
+ private final SpeedTracerLogger logger;
+
+ public TestLoggerThreadedThread(EventType event, SpeedTracerLogger
logger) {
+ super();
+ this.event = event;
+ this.logger = logger;
+ }
+
+ @Override
+ public void run() {
+ for (int i = 0; i < MAX_EVENT_LOGS; i++) {
+ logger.startImpl(event);
+ logger.endImpl(event);
+ }
+ }
+ }
+
+ private static final EventType dummyOne = new
DummyEventType("Larry", "Red");
+
+ private static final EventType dummyThree = new
DummyEventType("Moe", "Blue");
+
+ private static final EventType dummyTwo = new
DummyEventType("Curly", "Green");
+
+ private static final int MAX_EVENT_LOGS = 10000;
+
+ public void testSpeedTracerLogger() throws IOException, JsonException {
+ Writer writer = new StringWriter();
+ SpeedTracerLogger logger = new SpeedTracerLogger(writer);
+ logger.startImpl(dummyOne);
+ logger.startImpl(dummyTwo);
+ logger.endImpl(dummyTwo);
+ logger.startImpl(dummyThree);
+ logger.endImpl(dummyThree);
+ logger.endImpl(dummyOne);
+ logger.flush();
+
+ Reader jsonReader = extractJsonFromWriter(writer);
+ JsonObject parsedObject = JsonObject.parse(jsonReader);
+ assertTrue("dummyOne", compareJsonToEvent(parsedObject, dummyOne));
+
+ JsonObject dataObject = parsedObject.get("data").asObject();
+ assertNotNull(dataObject);
+
+ JsonArray childArray = parsedObject.get("children").asArray();
+ assertNotNull(childArray);
+ assertEquals(2, childArray.getLength());
+
+ JsonObject child = childArray.get(0).asObject();
+ assertTrue("dummyTwo", compareJsonToEvent(child, dummyTwo));
+
+ child = childArray.get(1).asObject();
+ assertTrue("dummyThree", compareJsonToEvent(child, dummyThree));
+ }
+
+ public void testSpeedTracerLoggerExtraData() throws IOException,
+ JsonException {
+ Writer writer = new StringWriter();
+ SpeedTracerLogger logger = new SpeedTracerLogger(writer);
+ logger.startImpl(dummyOne, "extraStart", "valueStart");
+ logger.addDataImpl("extraMiddle", "valueMiddle");
+ logger.endImpl(dummyOne, "extraEnd", "valueEnd");
+ logger.flush();
+
+ Reader jsonReader = extractJsonFromWriter(writer);
+ JsonObject parsedObject = JsonObject.parse(jsonReader);
+ assertEquals("valueStart", parsedObject.get("data").asObject().get(
+ "extraStart").asString().getString());
+ assertEquals(
+ "valueMiddle",
+
parsedObject.get("data").asObject().get("extraMiddle").asString().getString());
+ assertEquals(
+ "valueEnd",
+
parsedObject.get("data").asObject().get("extraEnd").asString().getString());
+ }
+
+ public void testSpeedTracerLoggerMultiple() throws IOException,
JsonException {
+ Writer writer = new StringWriter();
+ SpeedTracerLogger logger = new SpeedTracerLogger(writer);
+ logger.startImpl(dummyOne);
+ logger.endImpl(dummyOne);
+ logger.startImpl(dummyTwo);
+ logger.endImpl(dummyTwo);
+ logger.startImpl(dummyThree);
+ logger.endImpl(dummyThree);
+ logger.flush();
+
+ Reader jsonReader = extractJsonFromWriter(writer);
+ JsonObject dummyOneObject = JsonObject.parse(jsonReader).asObject();
+ JsonObject dummyTwoObject = JsonObject.parse(jsonReader).asObject();
+ JsonObject dummyThreeObject = JsonObject.parse(jsonReader).asObject();
+
+ assertTrue(compareJsonToEvent(dummyOneObject, dummyOne));
+ assertTrue(compareJsonToEvent(dummyTwoObject, dummyTwo));
+ assertTrue(compareJsonToEvent(dummyThreeObject, dummyThree));
+ }
+
+ public void testSpeedTracerLoggerThreaded() throws InterruptedException,
+ IOException {
+ final int NUM_THREADS = 3;
+ Writer writer = new StringWriter();
+ SpeedTracerLogger logger = new SpeedTracerLogger(writer);
+ Thread threads[] = new Thread[NUM_THREADS];
+ threads[0] = new TestLoggerThreadedThread(dummyOne, logger);
+ threads[1] = new TestLoggerThreadedThread(dummyTwo, logger);
+ threads[2] = new TestLoggerThreadedThread(dummyThree, logger);
+ for (int i = 0; i < NUM_THREADS; i++) {
+ threads[i].start();
+ }
+ for (int i = 0; i < NUM_THREADS; i++) {
+ threads[i].join();
+ }
+ logger.flush();
+ BufferedReader jsonReader = extractJsonFromWriter(writer);
+
+ int tally[] = new int[NUM_THREADS];
+ for (int i = 0; i < MAX_EVENT_LOGS * NUM_THREADS; i++) {
+ JsonObject result = null;
+ try {
+ result = JsonObject.parse(jsonReader).asObject();
+ } catch (JsonException ex) {
+ fail("Failed to parse json after " + i + " iterations. "
+ + ex.toString());
+ }
+ if (compareJsonToEvent(result, dummyOne)) {
+ tally[0]++;
+ } else if (compareJsonToEvent(result, dummyTwo)) {
+ tally[1]++;
+ } else if (compareJsonToEvent(result, dummyThree)) {
+ tally[2]++;
+ } else {
+ fail("Node with typeName "
+ + result.get("typeName").asString().getString()
+ + " doesn't match expected");
+ }
+ }
+ for (int i = 0; i < NUM_THREADS; i++) {
+ assertEquals("dummy" + i + " has the wrong number of logs.",
tally[i],
+ MAX_EVENT_LOGS);
+ }
+ }
+
+ private boolean compareJsonToEvent(JsonObject jsonObject, EventType
eventType) {
+ String typeName = jsonObject.get("typeName").asString().getString();
+ String color = jsonObject.get("color").asString().getString();
+ return typeName.equals(eventType.getName())
+ && color.equals(eventType.getColor());
+ }
+
+ private BufferedReader extractJsonFromWriter(Writer writer)
+ throws IOException {
+ String jsonString = writer.toString();
+ BufferedReader jsonReader = new BufferedReader(new
StringReader(jsonString));
+ // Skip ahead to start of JSON
+ while (true) {
+ jsonReader.mark(16 * 1024);
+ String line = jsonReader.readLine();
+ if (line == null) {
+ fail("Didn't find start of JSON string");
+ }
+ if (line.startsWith("{")) {
+ jsonReader.reset();
+ break;
+ }
+ }
+ return jsonReader;
+ }
+}
=======================================
---
/trunk/dev/core/test/com/google/gwt/dev/util/log/SpeedTracerLoggerTest.java
Thu Jul 22 13:05:55 2010
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may
not
- * use this file except in compliance with the License. You may obtain a
copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
under
- * the License.
- */
-package com.google.gwt.dev.util.log;
-
-import com.google.gwt.dev.json.JsonArray;
-import com.google.gwt.dev.json.JsonException;
-import com.google.gwt.dev.json.JsonObject;
-import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
-import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.EventType;
-
-import junit.framework.TestCase;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-
-/**
- * Tests the SpeedTracerLogger class.
- */
-public class SpeedTracerLoggerTest extends TestCase {
- private static class DummyEventType implements EventType {
- private final String color;
- private final String name;
-
- public DummyEventType(String name, String color) {
- this.name = name;
- this.color = color;
- }
-
- public String getColor() {
- return color;
- }
-
- public String getName() {
- return name;
- }
- }
- private class TestLoggerThreadedThread extends Thread {
-
- private final EventType event;
-
- public TestLoggerThreadedThread(EventType event) {
- super();
- this.event = event;
- }
-
- @Override
- public void run() {
- for (int i = 0; i < MAX_EVENT_LOGS; i++) {
- SpeedTracerLogger.get().start(event);
- SpeedTracerLogger.get().end(event);
- }
- }
- }
-
- private static final EventType dummyOne = new
DummyEventType("Larry", "Red");
-
- private static final EventType dummyThree = new
DummyEventType("Moe", "Blue");
-
- private static final EventType dummyTwo = new
DummyEventType("Curly", "Green");
-
- private static final int MAX_EVENT_LOGS = 10000;
-
- public void testSpeedTracerLogger() throws IOException, JsonException {
- Writer writer = new StringWriter();
- SpeedTracerLogger.init(writer);
- SpeedTracerLogger.get().start(dummyOne);
- SpeedTracerLogger.get().start(dummyTwo);
- SpeedTracerLogger.get().end(dummyTwo);
- SpeedTracerLogger.get().start(dummyThree);
- SpeedTracerLogger.get().end(dummyThree);
- SpeedTracerLogger.get().end(dummyOne);
- SpeedTracerLogger.get().flush();
-
- Reader jsonReader = extractJsonFromWriter(writer);
- JsonObject parsedObject = JsonObject.parse(jsonReader);
- assertTrue("dummyOne", compareJsonToEvent(parsedObject, dummyOne));
-
- JsonObject dataObject = parsedObject.get("data").asObject();
- assertNotNull(dataObject);
-
- JsonArray childArray = parsedObject.get("children").asArray();
- assertNotNull(childArray);
- assertEquals(2, childArray.getLength());
-
- JsonObject child = childArray.get(0).asObject();
- assertTrue("dummyTwo", compareJsonToEvent(child, dummyTwo));
-
- child = childArray.get(1).asObject();
- assertTrue("dummyThree", compareJsonToEvent(child, dummyThree));
- }
-
- public void testSpeedTracerLoggerExtraData() throws IOException,
- JsonException {
- Writer writer = new StringWriter();
- SpeedTracerLogger.init(writer);
- SpeedTracerLogger.get().start(dummyOne, "extraStart", "valueStart");
- SpeedTracerLogger.get().end(dummyOne, "extraEnd", "valueEnd");
- SpeedTracerLogger.get().flush();
-
- Reader jsonReader = extractJsonFromWriter(writer);
- JsonObject parsedObject = JsonObject.parse(jsonReader);
- assertEquals("valueStart",
parsedObject.get("data").asObject().get("extraStart").asString().getString());
- assertEquals("valueEnd",
parsedObject.get("data").asObject().get("extraEnd").asString().getString());
- }
-
- public void testSpeedTracerLoggerMultiple() throws IOException,
JsonException {
- Writer writer = new StringWriter();
- SpeedTracerLogger.init(writer);
- SpeedTracerLogger.get().start(dummyOne);
- SpeedTracerLogger.get().end(dummyOne);
- SpeedTracerLogger.get().start(dummyTwo);
- SpeedTracerLogger.get().end(dummyTwo);
- SpeedTracerLogger.get().start(dummyThree);
- SpeedTracerLogger.get().end(dummyThree);
- SpeedTracerLogger.get().flush();
-
- Reader jsonReader = extractJsonFromWriter(writer);
- JsonObject dummyOneObject = JsonObject.parse(jsonReader).asObject();
- JsonObject dummyTwoObject = JsonObject.parse(jsonReader).asObject();
- JsonObject dummyThreeObject = JsonObject.parse(jsonReader).asObject();
-
- assertTrue(compareJsonToEvent(dummyOneObject, dummyOne));
- assertTrue(compareJsonToEvent(dummyTwoObject, dummyTwo));
- assertTrue(compareJsonToEvent(dummyThreeObject, dummyThree));
- }
-
- public void testSpeedTracerLoggerThreaded() throws InterruptedException,
- IOException {
- final int NUM_THREADS = 3;
- Writer writer = new StringWriter();
- SpeedTracerLogger.init(writer);
- Thread threads[] = new Thread[NUM_THREADS];
- threads[0] = new TestLoggerThreadedThread(dummyOne);
- threads[1] = new TestLoggerThreadedThread(dummyTwo);
- threads[2] = new TestLoggerThreadedThread(dummyThree);
- for (int i = 0; i < NUM_THREADS; i++) {
- threads[i].start();
- }
- for (int i = 0; i < NUM_THREADS; i++) {
- threads[i].join();
- }
- SpeedTracerLogger.get().flush();
- BufferedReader jsonReader = extractJsonFromWriter(writer);
-
- int tally[] = new int[NUM_THREADS];
- for (int i = 0; i < MAX_EVENT_LOGS * NUM_THREADS; i++) {
- JsonObject result = null;
- try {
- result = JsonObject.parse(jsonReader).asObject();
- } catch (JsonException ex) {
- fail("Failed to parse json after " + i + " iterations. "
- + ex.toString());
- }
- if (compareJsonToEvent(result, dummyOne)) {
- tally[0]++;
- } else if (compareJsonToEvent(result, dummyTwo)) {
- tally[1]++;
- } else if (compareJsonToEvent(result, dummyThree)) {
- tally[2]++;
- } else {
- fail("Node with typeName "
- + result.get("typeName").asString().getString()
- + " doesn't match expected");
- }
- }
- for (int i = 0; i < NUM_THREADS; i++) {
- assertEquals("dummy" + i + " has the wrong number of logs.",
tally[i],
- MAX_EVENT_LOGS);
- }
- }
-
- private boolean compareJsonToEvent(JsonObject jsonObject, EventType
eventType) {
- String typeName = jsonObject.get("typeName").asString().getString();
- String color = jsonObject.get("color").asString().getString();
- return typeName.equals(eventType.getName())
- && color.equals(eventType.getColor());
- }
-
- private BufferedReader extractJsonFromWriter(Writer writer)
- throws IOException {
- String jsonString = writer.toString();
- BufferedReader jsonReader = new BufferedReader(new
StringReader(jsonString));
- // Skip ahead to start of JSON
- while (true) {
- jsonReader.mark(16 * 1024);
- String line = jsonReader.readLine();
- if (line == null) {
- fail("Didn't find start of JSON string");
- }
- if (line.startsWith("{")) {
- jsonReader.reset();
- break;
- }
- }
- return jsonReader;
- }
-}
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/Compiler.java Thu Jul 22
13:05:55 2010
+++ /trunk/dev/core/src/com/google/gwt/dev/Compiler.java Thu Jul 29
04:13:58 2010
@@ -171,16 +171,16 @@
ModuleDef[] modules = new ModuleDef[options.getModuleNames().size()];
int i = 0;
for (String moduleName : options.getModuleNames()) {
-
SpeedTracerLogger.get().start(CompilerEventType.MODULE_DEF, "phase", "loadFromClassPath", "moduleName",
moduleName);
+
SpeedTracerLogger.start(CompilerEventType.MODULE_DEF, "phase", "loadFromClassPath", "moduleName",
moduleName);
modules[i++] = ModuleDefLoader.loadFromClassPath(logger, moduleName,
true);
- SpeedTracerLogger.get().end(CompilerEventType.MODULE_DEF);
+ SpeedTracerLogger.end(CompilerEventType.MODULE_DEF);
}
return run(logger, modules);
}
public boolean run(TreeLogger logger, ModuleDef... modules)
throws UnableToCompleteException {
- SpeedTracerLogger.get().start(CompilerEventType.COMPILE);
+ SpeedTracerLogger.start(CompilerEventType.COMPILE);
boolean tempWorkDir = false;
try {
if (options.getWorkDir() == null) {
@@ -205,29 +205,29 @@
// Optimize early since permutation compiles will run in process.
options.setOptimizePrecompile(true);
- SpeedTracerLogger.get().start(CompilerEventType.PRECOMPILE);
+ SpeedTracerLogger.start(CompilerEventType.PRECOMPILE);
Precompilation precompilation = Precompile.precompile(branch,
options, module, options.getGenDir(),
options.getDumpSignatureFile());
- SpeedTracerLogger.get().end(CompilerEventType.PRECOMPILE);
+ SpeedTracerLogger.end(CompilerEventType.PRECOMPILE);
if (precompilation == null) {
return false;
}
-
SpeedTracerLogger.get().start(CompilerEventType.COMPILE_PERMUTATIONS);
+ SpeedTracerLogger.start(CompilerEventType.COMPILE_PERMUTATIONS);
Permutation[] allPerms = precompilation.getPermutations();
List<FileBackedObject<PermutationResult>> resultFiles =
CompilePerms.makeResultFiles(
options.getCompilerWorkDir(moduleName), allPerms);
CompilePerms.compile(branch, precompilation, allPerms,
options.getLocalWorkers(), resultFiles);
-
SpeedTracerLogger.get().end(CompilerEventType.COMPILE_PERMUTATIONS);
+ SpeedTracerLogger.end(CompilerEventType.COMPILE_PERMUTATIONS);
ArtifactSet generatedArtifacts =
precompilation.getGeneratedArtifacts();
JJSOptions precompileOptions =
precompilation.getUnifiedAst().getOptions();
precompilation = null; // No longer needed, so save the memory
- SpeedTracerLogger.get().start(CompilerEventType.LINK);
+ SpeedTracerLogger.start(CompilerEventType.LINK);
File absPath = new File(options.getWarDir(), module.getName());
absPath = absPath.getAbsoluteFile();
@@ -242,7 +242,7 @@
generatedArtifacts, allPerms, resultFiles,
options.getWarDir(),
options.getExtraDir(), precompileOptions);
- SpeedTracerLogger.get().end(CompilerEventType.LINK);
+ SpeedTracerLogger.end(CompilerEventType.LINK);
long compileDone = System.currentTimeMillis();
long delta = compileDone - compileStart;
branch.log(TreeLogger.INFO, "Compilation succeeded -- "
@@ -255,7 +255,7 @@
e);
return false;
} finally {
- SpeedTracerLogger.get().end(CompilerEventType.COMPILE);
+ SpeedTracerLogger.end(CompilerEventType.COMPILE);
if (tempWorkDir) {
Util.recursiveDelete(options.getWorkDir(), false);
}
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java Thu Jul 22
13:05:55 2010
+++ /trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java Thu Jul 29
04:13:58 2010
@@ -163,7 +163,7 @@
*/
public boolean run(TreeLogger logger, ModuleDef... modules)
throws UnableToCompleteException {
- SpeedTracerLogger.get().start(CompilerEventType.COMPILE);
+ SpeedTracerLogger.start(CompilerEventType.COMPILE);
boolean tempWorkDir = false;
try {
if (options.getWorkDir() == null) {
@@ -214,13 +214,12 @@
+ String.format("%.3f", delta / 1000d) + "s");
}
}
-
} catch (IOException e) {
logger.log(TreeLogger.ERROR, "Unable to create compiler work
directory",
e);
return false;
} finally {
- SpeedTracerLogger.get().end(CompilerEventType.COMPILE);
+ SpeedTracerLogger.end(CompilerEventType.COMPILE);
if (tempWorkDir) {
Util.recursiveDelete(options.getWorkDir(), false);
}
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/Precompile.java Thu Jul 22
13:05:55 2010
+++ /trunk/dev/core/src/com/google/gwt/dev/Precompile.java Thu Jul 29
04:13:58 2010
@@ -508,10 +508,10 @@
module, compilationState, generatedArtifacts, allPermutations,
genDir);
// Allow GC later.
compilationState = null;
- SpeedTracerLogger.get().start(CompilerEventType.PRECOMPILE);
+ SpeedTracerLogger.start(CompilerEventType.PRECOMPILE);
UnifiedAst unifiedAst = getCompiler(module).precompile(logger,
module,
rpo, declEntryPts, null, jjsOptions, rpo.getPermuationCount() ==
1);
- SpeedTracerLogger.get().end(CompilerEventType.PRECOMPILE);
+ SpeedTracerLogger.end(CompilerEventType.PRECOMPILE);
// Merge all identical permutations together.
List<Permutation> permutations = new ArrayList<Permutation>(
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java Thu Jul 22
13:05:55 2010
+++ /trunk/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java Thu Jul 29
04:13:58 2010
@@ -388,7 +388,7 @@
}
public synchronized void refresh(TreeLogger logger) {
-
SpeedTracerLogger.get().start(CompilerEventType.MODULE_DEF, "phase", "refresh", "module",
getName());
+
SpeedTracerLogger.start(CompilerEventType.MODULE_DEF, "phase", "refresh", "module",
getName());
logger = logger.branch(TreeLogger.DEBUG, "Refreshing module '" +
getName()
+ "'");
@@ -399,7 +399,7 @@
if (lazyResourcesOracle != null) {
lazyResourcesOracle.refresh(logger);
}
- SpeedTracerLogger.get().end(CompilerEventType.MODULE_DEF);
+ SpeedTracerLogger.end(CompilerEventType.MODULE_DEF);
}
/**
@@ -438,7 +438,7 @@
* @param logger Logs the activity.
*/
synchronized void normalize(TreeLogger logger) {
-
SpeedTracerLogger.get().start(CompilerEventType.MODULE_DEF, "phase", "normalize");
+
SpeedTracerLogger.start(CompilerEventType.MODULE_DEF, "phase", "normalize");
// Normalize property providers.
//
for (Property current : getProperties()) {
@@ -484,7 +484,7 @@
"No source path entries; expect subsequent failures", null);
}
- SpeedTracerLogger.get().end(CompilerEventType.MODULE_DEF);
+ SpeedTracerLogger.end(CompilerEventType.MODULE_DEF);
}
private void checkForSeedTypes(TreeLogger logger,
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java Thu Jul
22 13:05:55 2010
+++ /trunk/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java Thu Jul
29 04:13:58 2010
@@ -495,11 +495,11 @@
return false;
}
-
SpeedTracerLogger.get().start(CompilerEventType.JDT_COMPILER, "phase", "compile");
+
SpeedTracerLogger.start(CompilerEventType.JDT_COMPILER, "phase", "compile");
compilerImpl = new CompilerImpl();
compilerImpl.compile(icus.toArray(new ICompilationUnit[icus.size()]));
compilerImpl = null;
- SpeedTracerLogger.get().end(CompilerEventType.JDT_COMPILER);
+ SpeedTracerLogger.end(CompilerEventType.JDT_COMPILER);
lazyContentIdMap = null;
return true;
}
=======================================
---
/trunk/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java
Thu Jul 22 13:05:55 2010
+++
/trunk/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java
Thu Jul 29 04:13:58 2010
@@ -423,7 +423,7 @@
setCurrentGenerator(generatorClass);
long before = System.currentTimeMillis();
- SpeedTracerLogger.get().start(CompilerEventType.GENERATOR, "class",
+ SpeedTracerLogger.start(CompilerEventType.GENERATOR, "class",
generator.getClass().getName(), "type", typeName);
try {
String className = generator.generate(logger, this, typeName);
@@ -446,7 +446,7 @@
+ "' threw an exception while rebinding '" + typeName + "'", e);
throw new UnableToCompleteException();
} finally {
- SpeedTracerLogger.get().end(CompilerEventType.GENERATOR);
+ SpeedTracerLogger.end(CompilerEventType.GENERATOR);
}
}
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
Thu Jul 22 13:05:55 2010
+++ /trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
Thu Jul 29 04:13:58 2010
@@ -293,7 +293,7 @@
*/
public void addNewUnits(TreeLogger logger,
Collection<CompilationUnit> units) {
- SpeedTracerLogger.get().start(CompilerEventType.TYPE_ORACLE_MEDIATOR);
+ SpeedTracerLogger.start(CompilerEventType.TYPE_ORACLE_MEDIATOR);
// First collect all class data.
classMap = new HashMap<String, CollectClassData>();
for (CompilationUnit unit : units) {
@@ -363,7 +363,7 @@
allMethodArgs = null;
classMap = null;
classMapType = null;
- SpeedTracerLogger.get().end(CompilerEventType.TYPE_ORACLE_MEDIATOR);
+ SpeedTracerLogger.end(CompilerEventType.TYPE_ORACLE_MEDIATOR);
}
/**
=======================================
---
/trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
Wed Jul 28 11:12:18 2010
+++
/trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
Thu Jul 29 04:13:58 2010
@@ -603,29 +603,29 @@
*/
jprogram.beginOptimizations();
- SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE);
-
-
SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
+ SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE);
+
+ SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
"finalizer");
Finalizer.exec(jprogram);
- SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
-
-
SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
+ SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
+
+ SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
"makeCallsStatic");
MakeCallsStatic.exec(jprogram);
- SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
-
-
SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
+ SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
+
+ SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
"recomputeAfterOptimizations");
jprogram.typeOracle.recomputeAfterOptimizations();
- SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
-
-
SpeedTracerLogger.get().start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
+ SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
+
+ SpeedTracerLogger.start(CompilerEventType.DRAFT_OPTIMIZE, "phase",
"deadCodeElimination");
DeadCodeElimination.exec(jprogram);
- SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
-
- SpeedTracerLogger.get().end(CompilerEventType.DRAFT_OPTIMIZE);
+ SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
+
+ SpeedTracerLogger.end(CompilerEventType.DRAFT_OPTIMIZE);
}
protected static void optimize(JJSOptions options, JProgram jprogram)
@@ -637,10 +637,10 @@
*/
jprogram.beginOptimizations();
- SpeedTracerLogger.get().start(CompilerEventType.OPTIMIZE);
+ SpeedTracerLogger.start(CompilerEventType.OPTIMIZE);
do {
if (Thread.interrupted()) {
- SpeedTracerLogger.get().end(CompilerEventType.OPTIMIZE);
+ SpeedTracerLogger.end(CompilerEventType.OPTIMIZE);
throw new InterruptedException();
}
maybeDumpAST(jprogram);
@@ -650,12 +650,12 @@
// Just run it once, because it is very time consuming
DataflowOptimizer.exec(jprogram);
}
- SpeedTracerLogger.get().end(CompilerEventType.OPTIMIZE);
+ SpeedTracerLogger.end(CompilerEventType.OPTIMIZE);
}
protected static boolean optimizeLoop(JProgram jprogram,
boolean isAggressivelyOptimize) {
-
SpeedTracerLogger.get().start(CompilerEventType.OPTIMIZE, "phase", "loop");
+ SpeedTracerLogger.start(CompilerEventType.OPTIMIZE, "phase", "loop");
// Recompute clinits each time, they can become empty.
jprogram.typeOracle.recomputeAfterOptimizations();
// jprogram.methodOracle =
MethodOracleBuilder.buildMethodOracle(jprogram);
@@ -692,7 +692,7 @@
// prove that any types that have been culled from the main tree are
// unreferenced due to type tightening?
- SpeedTracerLogger.get().end(CompilerEventType.OPTIMIZE);
+ SpeedTracerLogger.end(CompilerEventType.OPTIMIZE);
return didChange;
}
@@ -1007,21 +1007,21 @@
ByteArrayOutputStream baos = new ByteArrayOutputStream();
- SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS);
-
- SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
+ SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+
+ SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
"phase", "recordSplitPoints");
SplitPointRecorder.recordSplitPoints(jprogram, baos, logger);
SyntheticArtifact splitPoints = new SyntheticArtifact(
SoycReportLinker.class, "splitPoints" + permutationId + ".xml.gz",
baos.toByteArray());
soycArtifacts.add(splitPoints);
- SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+ SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
SyntheticArtifact sizeMaps = null;
if (sizeBreakdowns != null) {
- SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
+ SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
"phase", "recordSizeMap");
baos.reset();
SizeMapRecorder.recordMap(logger, baos, sizeBreakdowns, jjsmap,
@@ -1029,17 +1029,17 @@
sizeMaps = new SyntheticArtifact(SoycReportLinker.class, "stories"
+ permutationId + ".xml.gz", baos.toByteArray());
soycArtifacts.add(sizeMaps);
- SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+ SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
}
if (sourceInfoMaps != null) {
- SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
+ SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
"phase", "recordStories");
baos.reset();
StoryRecorder.recordStories(logger, baos, sourceInfoMaps, js);
soycArtifacts.add(new SyntheticArtifact(SoycReportLinker.class,
"detailedStories" + permutationId + ".xml.gz",
baos.toByteArray()));
- SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+ SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
}
if (dependencies != null) {
@@ -1052,7 +1052,7 @@
}
if (sizeBreakdowns != null) {
- SpeedTracerLogger.get().start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
+ SpeedTracerLogger.start(CompilerEventType.MAKE_SOYC_ARTIFACTS,
"phase", "generateCompileReport");
ArtifactsOutputDirectory outDir = new ArtifactsOutputDirectory();
SoycDashboard dashboard = new SoycDashboard(outDir);
@@ -1076,10 +1076,10 @@
}
dashboard.generateForOnePermutation();
soycArtifacts.addAll(outDir.getArtifacts());
- SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+ SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
}
- SpeedTracerLogger.get().end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
+ SpeedTracerLogger.end(CompilerEventType.MAKE_SOYC_ARTIFACTS);
return soycArtifacts;
}
=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java Thu
Jul 22 13:05:55 2010
+++ /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter.java Thu
Jul 29 04:13:58 2010
@@ -785,7 +785,7 @@
}
private void execImpl() {
- SpeedTracerLogger.get().start(CompilerEventType.CODE_SPLITTER);
+ SpeedTracerLogger.start(CompilerEventType.CODE_SPLITTER);
Map<Integer, List<JsStatement>> fragmentStats = new HashMap<Integer,
List<JsStatement>>();
{
@@ -865,7 +865,7 @@
fragBlock.getStatements().addAll(fragmentStats.get(i));
}
- SpeedTracerLogger.get().end(CompilerEventType.CODE_SPLITTER);
+ SpeedTracerLogger.end(CompilerEventType.CODE_SPLITTER);
}
/**
=======================================
---
/trunk/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
Thu Jul 22 13:05:55 2010
+++
/trunk/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
Thu Jul 29 04:13:58 2010
@@ -320,7 +320,7 @@
* @param logger status and error details are written here
*/
public void refresh(TreeLogger logger) {
-
SpeedTracerLogger.get().start(CompilerEventType.RESOURCE_ORACLE, "phase", "refresh");
+
SpeedTracerLogger.start(CompilerEventType.RESOURCE_ORACLE, "phase", "refresh");
TreeLogger refreshBranch = Messages.REFRESHING_RESOURCES.branch(logger,
null);
@@ -387,7 +387,7 @@
if (!didChange) {
// Nothing to do, keep the same identities.
- SpeedTracerLogger.get().end(CompilerEventType.RESOURCE_ORACLE);
+ SpeedTracerLogger.end(CompilerEventType.RESOURCE_ORACLE);
return;
}
@@ -406,7 +406,7 @@
exposedResources = Collections.unmodifiableSet(externalSet);
exposedResourceMap = Collections.unmodifiableMap(externalMap);
exposedPathNames = Collections.unmodifiableSet(externalMap.keySet());
- SpeedTracerLogger.get().end(CompilerEventType.RESOURCE_ORACLE);
+ SpeedTracerLogger.end(CompilerEventType.RESOURCE_ORACLE);
}
public void setPathPrefixes(PathPrefixSet pathPrefixSet) {
=======================================
---
/trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java
Thu Jul 22 13:05:55 2010
+++
/trunk/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java
Thu Jul 29 04:13:58 2010
@@ -19,10 +19,10 @@
import com.google.gwt.dev.json.JsonObject;
import com.google.gwt.dev.util.collect.Lists;
+import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
-import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.concurrent.BlockingQueue;
@@ -57,27 +57,25 @@
* Represents a node in a tree of SpeedTracer events.
*/
private class Event {
-
- final List<Event> children = new ArrayList<Event>();
-
- final List<String> data = new ArrayList<String>();
-
+ List<Event> children = Lists.create();
+ List<String> data;
long durationNanos;
-
final long startTimeNanos;
-
final EventType type;
- Event(Event parent, EventType type, String[] data) {
+ Event() {
+ data = Lists.create();
+ this.startTimeNanos = normalizedTimeNanos();
+ this.type = null;
+ }
+
+ Event(Event parent, EventType type, String... data) {
if (parent != null) {
- parent.children.add(this);
+ parent.children = Lists.add(parent.children, this);
}
this.type = type;
- if (data != null) {
- for (int i = 0; i < data.length; i++) {
- this.data.add(data[i]);
- }
- }
+ assert (data.length % 2 == 0);
+ this.data = Lists.create(data);
this.startTimeNanos = normalizedTimeNanos();
}
@@ -86,9 +84,8 @@
*/
public void addData(String[] data) {
if (data != null) {
- for (int i = 0; i < data.length; i++) {
- this.data.add(data[i]);
- }
+ assert (data.length % 2 == 0);
+ this.data = Lists.addAll(this.data, data);
}
}
@@ -99,7 +96,6 @@
JsonObject toJson() {
JsonObject json = JsonObject.create();
-
json.put("type", -2);
json.put("typeName", type.getName());
json.put("color", type.getColor());
@@ -127,13 +123,20 @@
return nanos / 1000000.0d;
}
}
+
+ /**
+ * Initializes the singleton on demand.
+ */
+ private static class LazySpeedTracerLoggerHolder {
+ public static SpeedTracerLogger singleton = new SpeedTracerLogger();
+ }
/**
* Thread that converts log requests to JSON in the background.
*/
private class LogWriterThread extends Thread {
- private final BlockingQueue<Event> threadEventQueue;
private final String fileName;
+ private final BlockingQueue<Event> threadEventQueue;
private final Writer writer;
public LogWriterThread(Writer writer, String fileName,
@@ -175,71 +178,57 @@
}
}
}
-
- private static SpeedTracerLogger singleton;
/**
- * For accessing the logger as a singleton, you can retrieve the global
- * instance. You must first initialize the singleton with a call to
- * {...@link #init()} or {...@link #init(Writer)}.
+ * Annotate the current event on the top of the stack with more
information.
+ * The method expects key, value pairs, so there must be an even number
of
+ * parameters.
*
- * @return the current instance if one already exists from a previous
call to
- * {...@link #init()}
+ * @param data JSON property, value pair to add to current event.
*/
- public static synchronized SpeedTracerLogger get() {
- if (singleton == null) {
- init();
- }
- return singleton;
+ public static void addData(String... data) {
+ SpeedTracerLogger.get().addDataImpl(data);
}
/**
- * Create a new global instance. Force the zero time to be recorded and
the
- * log to be opened if the default logging is turned on with the
- * <code>-Dgwt.speedtracerlog</code> VM property.
- *
- * This method is only intended to be called once (except for unit
testing).
+ * Signals the end of the current event.
*/
- public static synchronized void init() {
- if (singleton != null) {
- singleton.flush();
- }
- singleton = newInstance();
+ public static void end(EventType type, String... data) {
+ SpeedTracerLogger.get().endImpl(type, data);
}
/**
- * Creates a new instance and assigns it to the global instance.
+ * Create a new global instance. Force the zero time to be recorded and
the
+ * log to be opened if the default logging is turned on with the
+ * <code>-Dgwt.speedtracerlog</code> VM property.
*
- * This method is only intended to be called once (except for unit
testing).
- *
- * @param writer The writer to use for logging messages.
+ * This method is only intended to be called once.
*/
- public static synchronized void init(Writer writer) {
- if (singleton != null) {
- singleton.flush();
- }
- singleton = newInstance(writer);
+ public static void init() {
+ get();
}
/**
- * Allocates a new instance of the logger. The global instance returned
by
- * init() or get() is not affected.
+ * Signals that a new event has started. You must call {...@link #end} for
each
+ * corresponding call to {...@code start}. You may nest timing calls.
*
- * @return a new {...@link SpeedTracerLogger} instance.
+ * @param type the type of event
+ * @data a set of key-value pairs (each key is followed by its value)
that
+ * contain additional information about the event
*/
- public static SpeedTracerLogger newInstance() {
- return new SpeedTracerLogger();
+ public static void start(EventType type, String... data) {
+ SpeedTracerLogger.get().startImpl(type, data);
}
/**
- * Allocates a new instance of the logger. The global instance returned
by
- * {...@link #init()} or {...@link #get()} is not affected.
+ * For accessing the logger as a singleton, you can retrieve the global
+ * instance. It is prudent, but not necessary to first initialize the
+ * singleton with a call to {...@link #init()} to set the base time.
*
- * @param writer The writer to use for logging messages.
- * @return a new {...@link SpeedTracerLogger} instance.
+ * @return the current global {...@link SpeedTracerLogger} instance.
*/
- public static SpeedTracerLogger newInstance(Writer writer) {
- return new SpeedTracerLogger(writer);
+ private static SpeedTracerLogger get() {
+ return LazySpeedTracerLoggerHolder.singleton;
}
private final BlockingQueue<Event> eventQueue = new
LinkedBlockingQueue<Event>();
@@ -248,7 +237,7 @@
private CountDownLatch flushLatch;
- private final Event flushSentinel = new Event(null, null, null);
+ private final Event flushSentinel = new Event();
private final ThreadLocal<Stack<Event>> pendingEvents = new
ThreadLocal<Stack<Event>>() {
@Override
@@ -259,22 +248,35 @@
private final CountDownLatch shutDownLatch = new CountDownLatch(1);
- private final Event shutDownSentinel = new Event(null, null, null);
+ private final Event shutDownSentinel = new Event();
private final long zeroTimeNanos = System.nanoTime();
+
+ /**
+ * Constructor intended for unit testing.
+ *
+ * @param writer alternative {...@link Writer} to send speed tracer output.
+ */
+ SpeedTracerLogger(Writer writer) {
+ eventsToWrite = openLogWriter(writer, "");
+ }
private SpeedTracerLogger() {
eventsToWrite = openDefaultLogWriter();
}
- private SpeedTracerLogger(Writer writer) {
- eventsToWrite = openLogWriter(writer, "");
+ public void addDataImpl(String... data) {
+ Stack<Event> threadPendingEvents = pendingEvents.get();
+ if (threadPendingEvents.isEmpty()) {
+ throw new IllegalStateException(
+ "Tried to add data to an event that never started!");
+ }
+
+ Event currentEvent = threadPendingEvents.peek();
+ currentEvent.addData(data);
}
- /**
- * Signals the end of the current event.
- */
- public void end(EventType type, String... data) {
+ void endImpl(EventType type, String... data) {
if (eventsToWrite == null) {
return;
}
@@ -320,7 +322,7 @@
/**
* Notifies the background thread to finish processing all data in the
queue.
*/
- public void flush() {
+ void flush() {
try {
// Wait for the other thread to drain the queue.
flushLatch = new CountDownLatch(1);
@@ -331,15 +333,7 @@
}
}
- /**
- * Signals that a new event has started. You must call {...@link #end} for
each
- * corresponding call to {...@code start}. You may nest timing calls.
- *
- * @param type the type of event
- * @data a set of key-value pairs (each key is followed by its value)
that
- * contain additional information about the event
- */
- public void start(EventType type, String... data) {
+ void startImpl(EventType type, String... data) {
if (eventsToWrite == null) {
return;
}
@@ -368,7 +362,7 @@
if (logFile != null) {
try {
- writer = new FileWriter(logFile);
+ writer = new BufferedWriter(new FileWriter(logFile));
return openLogWriter(writer, logFile);
} catch (IOException e) {
System.err.println("Unable to open gwt.speedtracerlog '" + logFile
@@ -389,7 +383,7 @@
+ "<a
href=\"http://code.google.com/speedtracer\">SpeedTracer</a> "
+ "extension under the <a
href=\"http://chrome.google.com/\">Chrome</a> browser.</div>"
+ "<p><span id=\"info\">(You must install the SpeedTracer
extension to open this file)</span></p>"
- + "<div style=\"display: none\" id=\"traceData\"
version=\"0.13\">\n");
+ + "<div style=\"display: none\" id=\"traceData\"
version=\"0.17\">\n");
} catch (IOException e) {
System.err.println("Unable to write to gwt.speedtracerlog '"
+ (fileName == null ? "" : fileName) + "'");
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors