diff options
author | Antonio Cunei <antonio.cunei@epfl.ch> | 2011-07-26 11:36:44 +0000 |
---|---|---|
committer | Antonio Cunei <antonio.cunei@epfl.ch> | 2011-07-26 11:36:44 +0000 |
commit | e8d37327e7c4ec060fc8f2588e1f2377e6a761fe (patch) | |
tree | 8c574cab644aa4cbaa3e1b11d67f9ed580ad9302 | |
parent | 3d61330ee849006cd3fe2a57223b268eb7d9834e (diff) | |
download | scala-e8d37327e7c4ec060fc8f2588e1f2377e6a761fe.tar.gz scala-e8d37327e7c4ec060fc8f2588e1f2377e6a761fe.tar.bz2 scala-e8d37327e7c4ec060fc8f2588e1f2377e6a761fe.zip |
Merged revisions 24466,25252 via svnmerge from
https://lampsvn.epfl.ch/svn-repos/scala/scala/trunk
........
r24466 | phaller | 2011-03-15 17:42:00 +0100 (Tue, 15 Mar 2011) | 1 line
Closes #3838. Review by prokopec.
........
r25252 | phaller | 2011-07-07 19:32:31 +0200 (Thu, 07 Jul 2011) | 1 line
Fixes SI-4759
........
-rw-r--r-- | src/actors/scala/actors/Actor.scala | 20 | ||||
-rw-r--r-- | test/files/jvm/actor-sync-send-timeout.scala | 47 | ||||
-rw-r--r-- | test/files/jvm/t3838.check | 1 | ||||
-rw-r--r-- | test/files/jvm/t3838.scala | 15 |
4 files changed, 78 insertions, 5 deletions
diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala index f49dd2e247..a5361e44ed 100644 --- a/src/actors/scala/actors/Actor.scala +++ b/src/actors/scala/actors/Actor.scala @@ -565,14 +565,24 @@ trait Actor extends AbstractActor with ReplyReactor with ActorCanReply with Inpu done = true receiveTimeout } else { + if (onTimeout.isEmpty) { + if (!f.isDefinedAt(TIMEOUT)) + sys.error("unhandled timeout") + + val thisActor = this + onTimeout = Some(new TimerTask { + def run() { + thisActor.send(TIMEOUT, thisActor) + } + }) + Actor.timer.schedule(onTimeout.get, msec) + } + + // It is possible that !onTimeout.isEmpty, but TIMEOUT is not yet in mailbox + // See SI-4759 waitingFor = f received = None isSuspended = true - val thisActor = this - onTimeout = Some(new TimerTask { - def run() { thisActor.send(TIMEOUT, thisActor) } - }) - Actor.timer.schedule(onTimeout.get, msec) scheduler.managedBlock(blocker) drainSendBuffer(mailbox) // keep going diff --git a/test/files/jvm/actor-sync-send-timeout.scala b/test/files/jvm/actor-sync-send-timeout.scala new file mode 100644 index 0000000000..ed330900b2 --- /dev/null +++ b/test/files/jvm/actor-sync-send-timeout.scala @@ -0,0 +1,47 @@ +import scala.actors.Actor + +/* This test is a regression test for SI-4759. + */ +object Test { + val Runs = 5 + + def main(args: Array[String]) = { + var i = 0 + while (i < Runs) { + i += 1 + A1 ! 1 + Thread.sleep(500) + } + //println("done sending to A1") + } +} + +object A2 extends Actor { + this.start() + def act() { + loop { + react { + case 'stop => + //println("A2 exiting") + exit() + case _ => + } + } + } +} + +object A1 extends Actor { + this.start() + def act() { + var i = 0 + loopWhile(i < Test.Runs) { + i += 1 + react { + case any => + A2 !? (500, any) + if (i == Test.Runs) + A2 ! 'stop + } + } + } +} diff --git a/test/files/jvm/t3838.check b/test/files/jvm/t3838.check new file mode 100644 index 0000000000..154227a350 --- /dev/null +++ b/test/files/jvm/t3838.check @@ -0,0 +1 @@ +caught java.lang.RuntimeException: unhandled timeout diff --git a/test/files/jvm/t3838.scala b/test/files/jvm/t3838.scala new file mode 100644 index 0000000000..ba8f15fc31 --- /dev/null +++ b/test/files/jvm/t3838.scala @@ -0,0 +1,15 @@ +import scala.actors.Actor._ + +object Test { + def main(args: Array[String]) { + actor { + try { + receiveWithin(1) { + case str: String => println(str) + } + } catch { + case e: Exception => println("caught "+e) + } + } + } +} |