blob: f2e1286654a83f122aad3c705be4fbe98117aa19 (
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
|
package scala.concurrent;
class Channel[a] {
class LinkedList[a] {
var elem: a = _;
var next: LinkedList[a] = null;
}
private var written = new LinkedList[a];
private var lastWritten = new LinkedList[a];
private var nreaders = 0;
def write(x: a) = synchronized {
lastWritten.elem = x;
lastWritten.next = new LinkedList[a];
lastWritten = lastWritten.next;
if (nreaders > 0) notify();
}
def read: a = synchronized {
if (written.next == null) {
nreaders = nreaders + 1; wait(); nreaders = nreaders - 1;
}
val x = written.elem;
written = written.next;
x
}
}
|