summaryrefslogtreecommitdiff
path: root/src/library
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/library
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/library')
-rw-r--r--src/library/scala/concurrent/SyncVar.scala16
1 files changed, 10 insertions, 6 deletions
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