diff options
author | Philipp Haller <hallerp@gmail.com> | 2010-01-07 11:35:41 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2010-01-07 11:35:41 +0000 |
commit | b5c141b4ed5e2db673a306a2ba0c23a1fbe2d9ee (patch) | |
tree | f9916464bb630df0e57a7ad1c8e5616cf0155b6a /test | |
parent | 57f14277dad0427b90abc1e6f70e2f8ae4dcbb51 (diff) | |
download | scala-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')
-rw-r--r-- | test/files/jvm/reactor-producer-consumer.check | 10 | ||||
-rw-r--r-- | test/files/jvm/reactor-producer-consumer.scala | 75 |
2 files changed, 85 insertions, 0 deletions
diff --git a/test/files/jvm/reactor-producer-consumer.check b/test/files/jvm/reactor-producer-consumer.check new file mode 100644 index 0000000000..d971cea19e --- /dev/null +++ b/test/files/jvm/reactor-producer-consumer.check @@ -0,0 +1,10 @@ +42 +42 +42 +42 +42 +42 +42 +42 +42 +42 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() + } +} |