summaryrefslogtreecommitdiff
path: root/sources/examples/boundedbuffer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-03-10 11:55:36 +0000
committerMartin Odersky <odersky@gmail.com>2003-03-10 11:55:36 +0000
commitd5da7d9aa5a8d4833775454853e81ead20cc37a7 (patch)
treed48297de81cb6c84853b94ae02b6edabee5bce5f /sources/examples/boundedbuffer.scala
parent1fb5a195b5575e7015be4fd1ee8f89116a78cfb5 (diff)
downloadscala-d5da7d9aa5a8d4833775454853e81ead20cc37a7.tar.gz
scala-d5da7d9aa5a8d4833775454853e81ead20cc37a7.tar.bz2
scala-d5da7d9aa5a8d4833775454853e81ead20cc37a7.zip
*** empty log message ***
Diffstat (limited to 'sources/examples/boundedbuffer.scala')
-rw-r--r--sources/examples/boundedbuffer.scala30
1 files changed, 30 insertions, 0 deletions
diff --git a/sources/examples/boundedbuffer.scala b/sources/examples/boundedbuffer.scala
new file mode 100644
index 0000000000..f308d0d472
--- /dev/null
+++ b/sources/examples/boundedbuffer.scala
@@ -0,0 +1,30 @@
+package examples;
+
+import concurrent.ops._;
+
+class BoundedBuffer[a](N: Int) extends Monitor() with {
+ var in = 0, out = 0, n = 0;
+ val elems = new Array[a](N);
+
+ def put(x: a) = synchronized {
+ await (n < N);
+ elems(in) = x ; in = (in + 1) % N ; n = n + 1;
+ if (n == 1) notifyAll();
+ }
+
+ def get: a = synchronized {
+ await (n != 0);
+ val x = elems(out) ; out = (out + 1) % N ; n = n - 1;
+ if (n == N - 1) notifyAll();
+ x
+ }
+}
+
+module test {
+ val buf = new BoundedBuffer[String](10);
+ var cnt = 0;
+ def produceString = { cnt = cnt + 1; cnt.toString() }
+ def consumeString(ss: String) = System.out.println(ss);
+ spawn { while (True) { val ssss = produceString ; buf.put(ssss) } }
+ spawn { while (True) { val s = buf.get ; consumeString(s) } }
+} \ No newline at end of file