diff options
author | Philipp Haller <hallerp@gmail.com> | 2009-10-26 21:01:12 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2009-10-26 21:01:12 +0000 |
commit | f3068614fb38fc08be54ac1179a1cfec52b8b13b (patch) | |
tree | 76ee219f209559d900b17682e29c9aaf9b3d73ab | |
parent | 63b1fd9be6c8c9e28092d775037c695af4b264e3 (diff) | |
download | scala-f3068614fb38fc08be54ac1179a1cfec52b8b13b.tar.gz scala-f3068614fb38fc08be54ac1179a1cfec52b8b13b.tar.bz2 scala-f3068614fb38fc08be54ac1179a1cfec52b8b13b.zip |
Second half of fix and tests for #1518.
13 files changed, 136 insertions, 12 deletions
diff --git a/docs/examples/actors/fringe.scala b/docs/examples/actors/fringe.scala index 2026628cb3..2afdc41b4f 100644 --- a/docs/examples/actors/fringe.scala +++ b/docs/examples/actors/fringe.scala @@ -2,6 +2,8 @@ package examples.actors import scala.actors.Actor._ import scala.actors.{Channel, OutputChannel} +import scala.actors.{Debug, Scheduler} +import scala.actors.scheduler.ResizableThreadPoolScheduler /** @author Philipp Haller @@ -18,6 +20,13 @@ object fringe extends Application { case class Equal(atom1: Option[Leaf], atom2: Option[Leaf]) case class Extract(tree: Tree) + Debug.level = 3 + Scheduler.impl = { + val s = new ResizableThreadPoolScheduler(false) + s.start() + s + } + val comparator = actor { val extractor1 = actor(extractorBehavior()) val extractor2 = actor(extractorBehavior()) diff --git a/docs/examples/actors/message.scala b/docs/examples/actors/message.scala index d385543470..eb29468160 100644 --- a/docs/examples/actors/message.scala +++ b/docs/examples/actors/message.scala @@ -3,6 +3,8 @@ package examples.actors import scala.actors.{Actor, Scheduler} import scala.actors.Actor._ import scala.actors.scheduler.SingleThreadedScheduler +import scala.actors.{Debug, Scheduler} +import scala.actors.scheduler.ResizableThreadPoolScheduler object message { def main(args: Array[String]) { @@ -14,7 +16,13 @@ object message { } val nActors = 500 val finalSum = n * nActors - Scheduler.impl = new SingleThreadedScheduler + //Scheduler.impl = new SingleThreadedScheduler + Debug.level = 3 + Scheduler.impl = { + val s = new ResizableThreadPoolScheduler(false) + s.start() + s + } def beh(next: Actor, sum: Int) { react { @@ -35,6 +43,6 @@ object message { val firstActor = actorChain(nActors, null) var i = n; while (i > 0) { firstActor ! 0; i -= 1 } - Scheduler.shutdown() + //Scheduler.shutdown() } } diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala index 553019932d..b563104f41 100644 --- a/src/actors/scala/actors/Actor.scala +++ b/src/actors/scala/actors/Actor.scala @@ -10,7 +10,6 @@ package scala.actors -import scala.compat.Platform import scala.util.control.ControlException import java.util.{Timer, TimerTask} import java.util.concurrent.{ExecutionException, Callable} @@ -439,7 +438,12 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor { var done = false while (!done) { - val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => f.isDefinedAt(m)) + val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => { + senders = replyTo :: senders + val matches = f.isDefinedAt(m) + senders = senders.tail + matches + }) if (null eq qel) { synchronized { // in mean time new stuff might have arrived @@ -496,7 +500,12 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor { var done = false while (!done) { - val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => f.isDefinedAt(m)) + val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => { + senders = replyTo :: senders + val matches = f.isDefinedAt(m) + senders = senders.tail + matches + }) if (null eq qel) { val todo = synchronized { // in mean time new stuff might have arrived @@ -592,7 +601,10 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor { var done = false while (!done) { - val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => f.isDefinedAt(m)) + val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => { + senders = List(replyTo) + f.isDefinedAt(m) + }) if (null eq qel) { val todo = synchronized { // in mean time new stuff might have arrived diff --git a/test/files/jvm/actor-receive-sender.check b/test/files/jvm/actor-receive-sender.check new file mode 100644 index 0000000000..2c94e48371 --- /dev/null +++ b/test/files/jvm/actor-receive-sender.check @@ -0,0 +1,2 @@ +OK +OK diff --git a/test/files/jvm/actor-receive-sender.scala b/test/files/jvm/actor-receive-sender.scala new file mode 100644 index 0000000000..ea7c40cced --- /dev/null +++ b/test/files/jvm/actor-receive-sender.scala @@ -0,0 +1,51 @@ +import scala.actors.{Actor, TIMEOUT, Exit} +import scala.actors.Actor._ + +object Test { + + val NUM = 2000 + + def main(args: Array[String]) { + var b: Actor = null + var c: Actor = null + + val a = actor { + for (_ <- 0 until NUM) + receive { + case 'hello if sender == b => // do nothing + } + b ! 'ok + for (_ <- 0 until NUM) + receiveWithin (1000) { + case 'bye if sender == b => // do nothing + case TIMEOUT => b ! 'fail + } + b ! 'ok + } + + b = actor { + self.trapExit = true + link(a) + + for (_ <- 0 until NUM) + a ! 'hello + + val proceed = receive { + case Exit(from, reason) => println("FAIL"); false + case 'ok => println("OK"); true + case other => println(other); false + } + + if (proceed) { + for (_ <- 0 until NUM) + a ! 'bye + receive { + case Exit(from, reason) => println("FAIL") + case 'ok => println("OK") + case other => println(other) + } + } + } + } + +} diff --git a/test/files/jvm/replyreactor-react-sender.check b/test/files/jvm/replyreactor-react-sender.check new file mode 100644 index 0000000000..d86bac9de5 --- /dev/null +++ b/test/files/jvm/replyreactor-react-sender.check @@ -0,0 +1 @@ +OK diff --git a/test/files/jvm/replyreactor-react-sender.scala b/test/files/jvm/replyreactor-react-sender.scala new file mode 100644 index 0000000000..1127dfd0a5 --- /dev/null +++ b/test/files/jvm/replyreactor-react-sender.scala @@ -0,0 +1,41 @@ +import scala.actors.ReplyReactor +import scala.actors.Actor._ + +object Test { + + val NUM = 2000 + + def main(args: Array[String]) { + var b: ReplyReactor = null + + val a = new ReplyReactor { + def act() { + var i = 0 + loopWhile (i < NUM) { + i += 1 + react { + case 'hello if sender == this => b ! 'fail + case 'hello if sender == b => // do nothing + } + } andThen { + b ! 'ok + } + } + } + a.start() + + b = new ReplyReactor { + def act() { + for (_ <- 0 until NUM) + a ! 'hello + react { + case 'fail => println("FAIL") + case 'ok => println("OK") + case other => println(other) + } + } + } + b.start() + } + +} diff --git a/test/files/neg/plugin-after-terminal/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-after-terminal/lib/plugins.jar.desired.sha1 index 23c54fb2de..30eca6b315 100644 --- a/test/files/neg/plugin-after-terminal/lib/plugins.jar.desired.sha1 +++ b/test/files/neg/plugin-after-terminal/lib/plugins.jar.desired.sha1 @@ -1 +1 @@ -cf80703ed94f5176dc099c60b32d0483322de9eb ?plugins.jar +eeefa01bb3bc224f75a2ee3d82a82054f4532b5f ?plugins.jar diff --git a/test/files/neg/plugin-before-parser/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-before-parser/lib/plugins.jar.desired.sha1 index 27c022e853..2aab42459e 100644 --- a/test/files/neg/plugin-before-parser/lib/plugins.jar.desired.sha1 +++ b/test/files/neg/plugin-before-parser/lib/plugins.jar.desired.sha1 @@ -1 +1 @@ -2e05e73ed90aaf286fa6555d992c1da18de3ceca ?plugins.jar +755fb75a6c635ca586f79e05c2785d55e52021cf ?plugins.jar diff --git a/test/files/neg/plugin-cyclic-dependency/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-cyclic-dependency/lib/plugins.jar.desired.sha1 index f1fb45387c..61479de33d 100644 --- a/test/files/neg/plugin-cyclic-dependency/lib/plugins.jar.desired.sha1 +++ b/test/files/neg/plugin-cyclic-dependency/lib/plugins.jar.desired.sha1 @@ -1 +1 @@ -d96a5f1b3885225a5e203ae59ae2f2f3e3c65c9b ?plugins.jar +217093efbc909edc21564a42c7069a9561921872 ?plugins.jar diff --git a/test/files/neg/plugin-multiple-rafter/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-multiple-rafter/lib/plugins.jar.desired.sha1 index 9706b6dd60..761063a205 100644 --- a/test/files/neg/plugin-multiple-rafter/lib/plugins.jar.desired.sha1 +++ b/test/files/neg/plugin-multiple-rafter/lib/plugins.jar.desired.sha1 @@ -1 +1 @@ -ee728763d50a19e725f729797d5afab05d395c4e ?plugins.jar +3be489ca675f18a64e0af8f5c7efcbe0f7cae2ab ?plugins.jar diff --git a/test/files/neg/plugin-rafter-before-1/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-rafter-before-1/lib/plugins.jar.desired.sha1 index b07cece8b9..f6df99f615 100644 --- a/test/files/neg/plugin-rafter-before-1/lib/plugins.jar.desired.sha1 +++ b/test/files/neg/plugin-rafter-before-1/lib/plugins.jar.desired.sha1 @@ -1 +1 @@ -398fa866d1d5c6608c9607dd1079afc12182119f ?plugins.jar +aa034e5f24a9cc5c3d73e3fe79000c80e0028b81 ?plugins.jar diff --git a/test/files/neg/plugin-rightafter-terminal/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-rightafter-terminal/lib/plugins.jar.desired.sha1 index 78a4fc0c98..2d4f41ffdd 100644 --- a/test/files/neg/plugin-rightafter-terminal/lib/plugins.jar.desired.sha1 +++ b/test/files/neg/plugin-rightafter-terminal/lib/plugins.jar.desired.sha1 @@ -1 +1 @@ -b2166b6bc2a55264d959e613fa52695295db2281 ?plugins.jar +6c9a6c7c3c5b86ece1d56476f7d6a35b6d7d7a03 ?plugins.jar |