diff options
Diffstat (limited to 'sources/scala/concurrent/Channel.scala')
-rw-r--r-- | sources/scala/concurrent/Channel.scala | 21 |
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; + } +} |