From d799a9162da02eb6033f5d7af5ea48849cd4232b Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Wed, 19 Apr 2017 11:07:47 -0500 Subject: [PATCH 1/2] Fix the infinite cycle in Lazy Vlas Reported by Andrzej Plutecki in https://groups.google.com/forum/#!topic/dotty-internals/3LMNItLQw-A I haven't seen this happen in practice in hours and hours of benchmarking, but this is indeed a formal bug. --- library/src/dotty/runtime/LazyVals.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/library/src/dotty/runtime/LazyVals.scala b/library/src/dotty/runtime/LazyVals.scala index 4dea0d34dbe9..9a7e153b0788 100644 --- a/library/src/dotty/runtime/LazyVals.scala +++ b/library/src/dotty/runtime/LazyVals.scala @@ -55,7 +55,8 @@ object LazyVals { else if (state == 2) { val monitor = getMonitor(t, ord) monitor.synchronized { - monitor.wait() + if (STATE(cur, ord) == 2) + monitor.wait() } } else retry = false From 423fe1142702a93613e625f1deb9c2634cf3567b Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Wed, 19 Apr 2017 11:32:20 -0500 Subject: [PATCH 2/2] Fix the fix Long time since I wrote this code. Forgot that `State` doesn't read the state. --- library/src/dotty/runtime/LazyVals.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/dotty/runtime/LazyVals.scala b/library/src/dotty/runtime/LazyVals.scala index 9a7e153b0788..2094cff8e9a4 100644 --- a/library/src/dotty/runtime/LazyVals.scala +++ b/library/src/dotty/runtime/LazyVals.scala @@ -55,7 +55,7 @@ object LazyVals { else if (state == 2) { val monitor = getMonitor(t, ord) monitor.synchronized { - if (STATE(cur, ord) == 2) + if (STATE(get(t, offset), ord) == 2) // make sure notification did not happen yet. monitor.wait() } }