summaryrefslogtreecommitdiff
path: root/sources/scala/concurrent/Channel.scala
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scala/concurrent/Channel.scala')
-rw-r--r--sources/scala/concurrent/Channel.scala21
1 files changed, 21 insertions, 0 deletions
diff --git a/sources/scala/concurrent/Channel.scala b/sources/scala/concurrent/Channel.scala
new file mode 100644
index 0000000000..b58cf15862
--- /dev/null
+++ b/sources/scala/concurrent/Channel.scala
@@ -0,0 +1,21 @@
+package scala.concurrent;
+
+class Channel[a]() extends Monitor() {
+ private var written: LinkedList[a] = new LinkedList();
+ private var lastWritten = written;
+ private var nreaders = 0;
+
+ def write(x: a) = synchronized {
+ lastWritten.next = new LinkedList();
+ lastWritten = lastWritten.next;
+ if (nreaders > 0) notify();
+ }
+
+ def read: a = synchronized {
+ if (written.next == null) {
+ nreaders = nreaders + 1; wait(); nreaders = nreaders - 1;
+ }
+ written = written.next;
+ written.elem;
+ }
+}