diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-12-13 18:05:11 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-12-13 18:05:11 -0800 |
commit | 1d3da7ed9803fd0fe671da627458514bd0503b05 (patch) | |
tree | 2cde62b7105d289d4d3bf7fefee6c51481208f33 /src/library | |
parent | 7e74aa6b134bcaf158bd51aa7a63a4aaa8fee62e (diff) | |
parent | a3a5e4a6f548bf8b9d2874a5d6578c8364a1984f (diff) | |
download | scala-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.scala | 16 |
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 |