Skip to content

Commit 4ba226e

Browse files
committed
Simplify Future handling
1 parent 40e30c3 commit 4ba226e

File tree

1 file changed

+11
-20
lines changed

1 file changed

+11
-20
lines changed

compiler/src/dotty/tools/dotc/util/concurrent.scala

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package dotty.tools.dotc.util
22
import scala.util.{Try, Failure, Success}
3-
import scala.annotation.tailrec
43
import scala.collection.mutable.ArrayBuffer
54

65
object concurrent:
@@ -10,15 +9,8 @@ object concurrent:
109
class Future[T](exec: Executor[T]):
1110
private var result: Option[Try[T]] = None
1211
def force: Try[T] = synchronized {
13-
@tailrec def recur(): Try[T] = result match
14-
case Some(r) => r
15-
case None =>
16-
if exec.isRunning then
17-
wait(1000 /*ms*/)
18-
recur()
19-
else
20-
Failure(NoCompletion())
21-
recur()
12+
while result.isEmpty && exec.isAlive do wait(1000 /*ms*/)
13+
result.getOrElse(Failure(NoCompletion()))
2214
}
2315
def complete(r: Try[T]): Unit = synchronized {
2416
result = Some(r)
@@ -29,13 +21,11 @@ object concurrent:
2921
class Executor[T] extends Thread:
3022
private type WorkItem = (Future[T], () => T)
3123

32-
@volatile private var terminated = false
3324
private var allScheduled = false
3425
private val pending = new ArrayBuffer[WorkItem]
3526

36-
def isRunning: Boolean = !terminated
37-
3827
def schedule(op: () => T): Future[T] = synchronized {
28+
assert(!allScheduled)
3929
val f = Future[T](this)
4030
pending += ((f, op))
4131
notifyAll()
@@ -57,13 +47,14 @@ object concurrent:
5747
}
5848

5949
override def run(): Unit =
60-
@tailrec def recur(): Unit = nextPending() match
61-
case Some((f, op)) =>
62-
f.complete(Try(op()))
63-
recur()
64-
case None =>
65-
try recur()
66-
finally terminated = true
50+
while
51+
nextPending() match
52+
case Some((f, op)) =>
53+
f.complete(Try(op()))
54+
true
55+
case None =>
56+
false
57+
do ()
6758
end Executor
6859
end concurrent
6960

0 commit comments

Comments
 (0)