diff options
author | Philipp Haller <hallerp@gmail.com> | 2007-04-20 12:47:54 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2007-04-20 12:47:54 +0000 |
commit | 30cac1fb061764efb1bf633b7e1b0849b0fff8d9 (patch) | |
tree | d6d016a2f76b4e61a7db9f1057dce25e164c37de | |
parent | af87cfc074b4aa38ee3df7bc9d5a53c0f6eb64c5 (diff) | |
download | scala-30cac1fb061764efb1bf633b7e1b0849b0fff8d9.tar.gz scala-30cac1fb061764efb1bf633b7e1b0849b0fff8d9.tar.bz2 scala-30cac1fb061764efb1bf633b7e1b0849b0fff8d9.zip |
Fixed Actor.exit, added continue for loop { }.
-rw-r--r-- | src/actors/scala/actors/Actor.scala | 49 | ||||
-rw-r--r-- | src/actors/scala/actors/ActorProxy.scala | 2 | ||||
-rw-r--r-- | src/actors/scala/actors/Reaction.scala | 2 |
3 files changed, 36 insertions, 17 deletions
diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala index d2098a2813..080dc155fa 100644 --- a/src/actors/scala/actors/Actor.scala +++ b/src/actors/scala/actors/Actor.scala @@ -178,9 +178,10 @@ object Actor { def seq[a, b](first: => a, next: => b): Nothing = { val s = self val killNext = s.kill - s.kill = () => { s.kill = killNext; next; exit('normal) } + s.kill = () => { s.kill = killNext; next; s.kill() } first - exit('normal) + s.kill() + throw new ExitActorException } /** @@ -214,7 +215,7 @@ object Actor { * <p> * For each linked actor <code>a</code> with * <code>trapExit</code> set to <code>true</code>, send message - * <code>{'EXIT, self, reason}</code> to <code>a</code>. + * <code>Exit(self, reason)</code> to <code>a</code>. * </p> * <p> * For each linked actor <code>a</code> with @@ -224,6 +225,21 @@ object Actor { * </p> */ def exit(reason: AnyRef): Nothing = self.exit(reason) + + /** + * <p> + * Terminates execution of <code>self</code> with the following + * effect on linked actors: + * </p> + * <p> + * For each linked actor <code>a</code> with + * <code>trapExit</code> set to <code>true</code>, send message + * <code>Exit(self, 'normal)</code> to <code>a</code>. + * </p> + */ + def exit(): Nothing = self.exit() + + def continue: unit = self.kill() } /** @@ -526,7 +542,7 @@ trait Actor extends OutputChannel[Any] { private[actors] def tick(): Unit = Scheduler tick this - private[actors] var kill = () => {} + private[actors] var kill: () => unit = () => {} def suspendActor() { isWaiting = true @@ -632,7 +648,7 @@ trait Actor extends OutputChannel[Any] { * <p> * For each linked actor <code>a</code> with * <code>trapExit</code> set to <code>true</code>, send message - * <code>{'EXIT, self, reason}</code> to <code>a</code>. + * <code>Exit(self, reason)</code> to <code>a</code>. * </p> * <p> * For each linked actor <code>a</code> with @@ -642,19 +658,19 @@ trait Actor extends OutputChannel[Any] { * </p> */ def exit(reason: AnyRef): Nothing = { - if (reason == 'normal) kill() - // links - if (!links.isEmpty) { - exitReason = reason - exitLinked() - } - throw new ExitActorException + exitReason = reason + exit() } /** * Terminates with exit reason <code>'normal</code>. */ - def exit(): Nothing = exit('normal) + def exit(): Nothing = { + // links + if (!links.isEmpty) + exitLinked() + throw new ExitActorException + } // Assume !links.isEmpty private[actors] def exitLinked() { @@ -686,7 +702,7 @@ trait Actor extends OutputChannel[Any] { // Assume !this.exiting private[actors] def exit(from: Actor, reason: AnyRef) { if (trapExit) { - this ! Triple('EXIT, from, reason) + this ! Exit(from, reason) } else if (reason != 'normal) this.synchronized { @@ -694,8 +710,9 @@ trait Actor extends OutputChannel[Any] { exitReason = reason if (isSuspended) resumeActor() - else if (isDetached) + else if (isDetached) { scheduleActor(null, null) + } } } @@ -723,6 +740,8 @@ trait Actor extends OutputChannel[Any] { case object TIMEOUT +case class Exit(from: Actor, reason: AnyRef) + /** <p> * This class is used to manage control flow of actor * executions. diff --git a/src/actors/scala/actors/ActorProxy.scala b/src/actors/scala/actors/ActorProxy.scala index 0f6344f7c1..a195ed8f3d 100644 --- a/src/actors/scala/actors/ActorProxy.scala +++ b/src/actors/scala/actors/ActorProxy.scala @@ -33,7 +33,7 @@ private[actors] class ActorProxy(t: Thread) extends Actor { * <p> * For each linked actor <code>a</code> with * <code>trapExit</code> set to <code>true</code>, send message - * <code>{'EXIT, self, reason}</code> to <code>a</code>. + * <code>Exit(self, reason)</code> to <code>a</code>. * </p> * <p> * For each linked actor <code>a</code> with diff --git a/src/actors/scala/actors/Reaction.scala b/src/actors/scala/actors/Reaction.scala index 0b9f33a98c..4d282880a5 100644 --- a/src/actors/scala/actors/Reaction.scala +++ b/src/actors/scala/actors/Reaction.scala @@ -53,7 +53,7 @@ private[actors] class Reaction(a: Actor, a.act() else f(msg) - a.exit() + a.kill(); a.exit() } } catch { case _: ExitActorException => |