Fix SpeedTracer Log when compilation is spread across different processes.

The common time referrence recorded in "baseTime" was not correct.

Change-Id: If91008cd75c187dff667adc2411f60d4dadabbe3
Review-Link: https://gwt-review.googlesource.com/#/c/2031/

Review by: mdempsky@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@11533 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java b/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java
index 0866fcf..fa5730a 100644
--- a/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java
+++ b/dev/core/src/com/google/gwt/dev/util/log/speedtracer/SpeedTracerLogger.java
@@ -145,7 +145,7 @@
       this.children = Lists.create();
       this.devModeSession = session;
     }
-    
+
     /**
      * @param data key/value pairs to add to JSON object.
      */
@@ -395,20 +395,14 @@
   private class ElapsedNormalizedTimeKeeper {
 
     private final long zeroTimeNanos;
-    private final long zeroTimeMillis;
 
     public ElapsedNormalizedTimeKeeper() {
       zeroTimeNanos = System.nanoTime();
-      zeroTimeMillis = (long) convertToMilliseconds(zeroTimeNanos);
     }
 
     public long normalizedTimeNanos() {
       return System.nanoTime() - zeroTimeNanos;
     }
-    
-    public long zeroTimeMillis() {
-      return zeroTimeMillis;
-    }
   }
   
   /**
@@ -419,8 +413,7 @@
     private final OperatingSystemMXBean osMXBean;
     private final Method getProcessCpuTimeMethod;
     private final long zeroTimeNanos;
-    private final long zeroTimeMillis;
-    
+
     public ProcessNormalizedTimeKeeper() {
       try {
         osMXBean = ManagementFactory.getOperatingSystemMXBean();
@@ -433,7 +426,6 @@
           osMXBean.getClass().getMethod("getProcessCpuTime");
         getProcessCpuTimeMethod.setAccessible(true);
         zeroTimeNanos = (Long) getProcessCpuTimeMethod.invoke(osMXBean);
-        zeroTimeMillis = (long) convertToMilliseconds(zeroTimeNanos);
       } catch (Exception ex) {
         throw new RuntimeException(ex);
       }
@@ -446,10 +438,6 @@
         throw new RuntimeException(ex);
       }
     }
-
-    public long zeroTimeMillis() {
-      return zeroTimeMillis;
-    }
   }
 
   /**
@@ -467,7 +455,6 @@
     private final ThreadMXBean threadMXBean;
     private final ThreadLocal<Long> resettableTimeBase = new ThreadLocal<Long>();
     private final long zeroTimeNanos;
-    private final long zeroTimeMillis;
 
     public ThreadNormalizedTimeKeeper() {
       threadMXBean = ManagementFactory.getThreadMXBean();
@@ -475,7 +462,6 @@
         throw new RuntimeException("Current thread cpu time not supported");
       }
       zeroTimeNanos = System.nanoTime();
-      zeroTimeMillis = (long) convertToMilliseconds(zeroTimeNanos);
     }
 
     public long normalizedTimeNanos() {
@@ -490,11 +476,7 @@
       resettableTimeBase.set(System.nanoTime() 
           - zeroTimeNanos - threadMXBean.getCurrentThreadCpuTime());
     }
-    
-    public long zeroTimeMillis() {
-      return zeroTimeMillis;
-    }
-  } 
+  }
 
   /**
    * Initializes the singleton on demand.
@@ -714,6 +696,15 @@
               (logThreadCpuTime) ? new ThreadNormalizedTimeKeeper() : null;
 
   /**
+   * Time in millis since the start of this process. To be used when merging timelines
+   * created by different processes.
+   *
+   * Do not use nanoTime since it is not related to any fixed moment in time and
+   * hence can not be used for merging timelines from different processes.
+   */
+  private final long baseTimeMillis = System.currentTimeMillis();
+
+  /**
    * Constructor intended for unit testing.
    * 
    * @param writer alternative {@link Writer} to send speed tracer output.
@@ -917,10 +908,7 @@
     // Add a field to the top level event in order to  track the base time
     // so we can re-normalize the data
     if (threadPendingEvents.size() == 0) {
-      long baseTime = logProcessCpuTime ? processCpuTimeKeeper.zeroTimeMillis()
-          : (logThreadCpuTime ? threadCpuTimeKeeper.zeroTimeMillis()
-              : elapsedTimeKeeper.zeroTimeMillis());
-      newEvent.addData("baseTime", "" + baseTime);
+      newEvent.addData("baseTime", "" + baseTimeMillis);
     }
     threadPendingEvents.push(newEvent);
     return newEvent;