blob: 94c7c0e3ccb222061f713ef49e8bf47ac1931b37 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package scala.tools.nsc
package util
import scala.collection.mutable.Queue
class WorkScheduler {
type Action = () => Unit
private var todo = new Queue[Action]
private var except: Option[Exception] = None
/** Called from server: block until todo list is nonempty */
def waitForMoreWork() = synchronized {
while (todo.isEmpty) { wait() }
}
/** called from Server: test whether todo list is nonempty */
def moreWork(): Boolean = synchronized {
todo.nonEmpty
}
/** Called from server: get first action in todo list, and pop it off */
def nextWorkItem(): Option[Action] = synchronized {
if (!todo.isEmpty) {
Some(todo.dequeue())
} else None
}
/** Called from server: return optional exception posted by client
* Reset to no exception.
*/
def pollException(): Option[Exception] = synchronized {
val result = except; except = None; result
}
/** Called from client: have action executed by server */
def postWorkItem(action: Action) = synchronized {
todo enqueue action
notify()
}
/** Called from client: cancel all queued actions */
def cancelQueued() = synchronized {
todo.clear()
}
/** Called from client:
* Require an exception to be thrown on next poll.
*/
def raise(exc: Exception) = synchronized {
except = Some(exc)
}
}
|