summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2013-12-13 18:05:11 -0800
committerAdriaan Moors <adriaan.moors@typesafe.com>2013-12-13 18:05:11 -0800
commit1d3da7ed9803fd0fe671da627458514bd0503b05 (patch)
tree2cde62b7105d289d4d3bf7fefee6c51481208f33 /src
parent7e74aa6b134bcaf158bd51aa7a63a4aaa8fee62e (diff)
parenta3a5e4a6f548bf8b9d2874a5d6578c8364a1984f (diff)
downloadscala-1d3da7ed9803fd0fe671da627458514bd0503b05.tar.gz
scala-1d3da7ed9803fd0fe671da627458514bd0503b05.tar.bz2
scala-1d3da7ed9803fd0fe671da627458514bd0503b05.zip
Merge pull request #3266 from soc/SI-7546
SI-7546 Use likely monotonic clock source for durations
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala5
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/InlineExceptionHandlers.scala6
-rw-r--r--src/library/scala/concurrent/SyncVar.scala16
-rw-r--r--src/reflect/scala/reflect/internal/SymbolTable.scala3
4 files changed, 19 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala
index f10d7cdc40..2e44c405cf 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala
@@ -8,6 +8,7 @@ package tools.nsc
package backend.icode.analysis
import scala.collection.{mutable, immutable}
+import java.util.concurrent.TimeUnit
/** A data-flow analysis on types, that works on `ICode`.
*
@@ -709,14 +710,14 @@ abstract class TypeFlowAnalysis {
private var lastStart = 0L
def start() {
- lastStart = System.currentTimeMillis
+ lastStart = System.nanoTime()
}
/** Stop the timer and return the number of milliseconds since the last
* call to start. The 'millis' field is increased by the elapsed time.
*/
def stop: Long = {
- val elapsed = System.currentTimeMillis - lastStart
+ val elapsed = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - lastStart)
millis += elapsed
elapsed
}
diff --git a/src/compiler/scala/tools/nsc/backend/opt/InlineExceptionHandlers.scala b/src/compiler/scala/tools/nsc/backend/opt/InlineExceptionHandlers.scala
index f4e97a91d8..235e954f88 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/InlineExceptionHandlers.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/InlineExceptionHandlers.scala
@@ -5,6 +5,8 @@
package scala.tools.nsc
package backend.opt
+import java.util.concurrent.TimeUnit
+
/**
* This optimization phase inlines the exception handlers so that further phases can optimize the code better
*
@@ -91,12 +93,12 @@ abstract class InlineExceptionHandlers extends SubComponent {
/** Apply exception handler inlining to a class */
override def apply(c: IClass): Unit =
if (settings.inlineHandlers) {
- val startTime = System.currentTimeMillis
+ val startTime = System.nanoTime()
currentClass = c
debuglog("Starting InlineExceptionHandlers on " + c)
c.methods foreach applyMethod
- debuglog("Finished InlineExceptionHandlers on " + c + "... " + (System.currentTimeMillis - startTime) + "ms")
+ debuglog("Finished InlineExceptionHandlers on " + c + "... " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime) + "ms")
currentClass = null
}
diff --git a/src/library/scala/concurrent/SyncVar.scala b/src/library/scala/concurrent/SyncVar.scala
index 76d21c3dbf..d5dc3d7e3f 100644
--- a/src/library/scala/concurrent/SyncVar.scala
+++ b/src/library/scala/concurrent/SyncVar.scala
@@ -8,6 +8,8 @@
package scala.concurrent
+import java.util.concurrent.TimeUnit
+
/** A class to provide safe concurrent access to a mutable cell.
* All methods are synchronized.
*
@@ -23,14 +25,16 @@ class SyncVar[A] {
value.get
}
- /** Waits `timeout` millis. If `timeout <= 0` just returns 0. If the system clock
- * went backward, it will return 0, so it never returns negative results.
- */
+ /** Waits `timeout` millis. If `timeout <= 0` just returns 0.
+ * It never returns negative results.
+ */
private def waitMeasuringElapsed(timeout: Long): Long = if (timeout <= 0) 0 else {
- val start = System.currentTimeMillis
+ val start = System.nanoTime()
wait(timeout)
- val elapsed = System.currentTimeMillis - start
- if (elapsed < 0) 0 else elapsed
+ val elapsed = System.nanoTime() - start
+ // nanoTime should be monotonic, but it's not possible to rely on that.
+ // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458294.
+ if (elapsed < 0) 0 else TimeUnit.NANOSECONDS.toMillis(elapsed)
}
/** Waits for this SyncVar to become defined at least for
diff --git a/src/reflect/scala/reflect/internal/SymbolTable.scala b/src/reflect/scala/reflect/internal/SymbolTable.scala
index c3f3e35fb3..0ce5a0fbea 100644
--- a/src/reflect/scala/reflect/internal/SymbolTable.scala
+++ b/src/reflect/scala/reflect/internal/SymbolTable.scala
@@ -10,6 +10,7 @@ package internal
import scala.annotation.elidable
import scala.collection.{ mutable, immutable }
import util._
+import java.util.concurrent.TimeUnit
abstract class SymbolTable extends macros.Universe
with Collections
@@ -55,7 +56,7 @@ abstract class SymbolTable extends macros.Universe
def abort(msg: String): Nothing = throw new FatalError(supplementErrorMessage(msg))
protected def elapsedMessage(msg: String, start: Long) =
- msg + " in " + (System.currentTimeMillis() - start) + "ms"
+ msg + " in " + (TimeUnit.NANOSECONDS.toMillis(System.nanoTime()) - start) + "ms"
def informProgress(msg: String) = if (settings.verbose) inform("[" + msg + "]")
def informTime(msg: String, start: Long) = informProgress(elapsedMessage(msg, start))