summaryrefslogtreecommitdiff
path: root/test/files/jvm/reactor-producer-consumer.scala
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2010-01-07 11:35:41 +0000
committerPhilipp Haller <hallerp@gmail.com>2010-01-07 11:35:41 +0000
commitb5c141b4ed5e2db673a306a2ba0c23a1fbe2d9ee (patch)
treef9916464bb630df0e57a7ad1c8e5616cf0155b6a /test/files/jvm/reactor-producer-consumer.scala
parent57f14277dad0427b90abc1e6f70e2f8ae4dcbb51 (diff)
downloadscala-b5c141b4ed5e2db673a306a2ba0c23a1fbe2d9ee.tar.gz
scala-b5c141b4ed5e2db673a306a2ba0c23a1fbe2d9ee.tar.bz2
scala-b5c141b4ed5e2db673a306a2ba0c23a1fbe2d9ee.zip
Fixed issue in Reactor/Actor that could lead to...
Fixed issue in Reactor/Actor that could lead to premature termination of actors. Added test that could reproduce it (occurred more often on larger inputs, but test should not take too much time). The issue also caused the reactor-exceptionOnSend test to timeout sometimes. Review by plocinic.
Diffstat (limited to 'test/files/jvm/reactor-producer-consumer.scala')
-rw-r--r--test/files/jvm/reactor-producer-consumer.scala75
1 files changed, 75 insertions, 0 deletions
diff --git a/test/files/jvm/reactor-producer-consumer.scala b/test/files/jvm/reactor-producer-consumer.scala
new file mode 100644
index 0000000000..946e1561ce
--- /dev/null
+++ b/test/files/jvm/reactor-producer-consumer.scala
@@ -0,0 +1,75 @@
+import scala.actors.Reactor
+
+object Test {
+ case class Stop()
+ case class Get(from: Reactor)
+ case class Put(x: Int)
+
+ class UnboundedBuffer extends Reactor {
+ def act() {
+ react {
+ case Stop() =>
+ case Get(from) =>
+ val consumer = from
+ react {
+ case msg @ Put(x) =>
+ consumer ! x
+ act()
+ }
+ }
+ }
+ }
+
+ class Producer(buf: UnboundedBuffer, n: Int, delay: Long, parent: Reactor) extends Reactor {
+ def act() {
+ var i = 0
+ while (i < n) {
+ i += 1
+ if (delay > 0) Thread.sleep(delay)
+ buf ! Put(42)
+ }
+ parent ! Stop()
+ }
+ }
+
+ class Consumer(buf: UnboundedBuffer, n: Int, delay: Long, parent: Reactor) extends Reactor {
+ val step = n / 10
+ var i = 0
+ def act() {
+ if (i < n) {
+ i += 1
+ if (delay > 0) Thread.sleep(delay)
+ buf ! Get(this)
+ react {
+ case res =>
+ if (i % step == 0)
+ println(res)
+ act()
+ }
+ } else {
+ parent ! Stop()
+ }
+ }
+ }
+
+ def main(args: Array[String]) {
+ val parent = new Reactor {
+ def act() {
+ val buffer = new UnboundedBuffer
+ buffer.start()
+ val producer = new Producer(buffer, 10000, 0, this)
+ producer.start()
+ val consumer = new Consumer(buffer, 10000, 0, this)
+ consumer.start()
+ react {
+ case Stop() =>
+ react {
+ case Stop() =>
+ buffer ! Stop()
+ }
+ }
+ }
+ }
+ parent.start()
+ }
+}