From 39d6b1f81e3ddfe39ee8605cacf3b2c4b343bf94 Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Sun, 4 Feb 2007 19:00:53 +0000 Subject: scala.actors: removed Exit class. --- src/actors/scala/actors/Actor.scala | 53 +++++++++++++------------ src/actors/scala/actors/ActorProxy.scala | 6 +-- src/actors/scala/actors/Reaction.scala | 4 +- src/actors/scala/actors/remote/TcpService.scala | 6 +-- 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala index c4ebeef27b..fb2978ec9f 100644 --- a/src/actors/scala/actors/Actor.scala +++ b/src/actors/scala/actors/Actor.scala @@ -239,16 +239,16 @@ object Actor { *

* For each linked actor a with * trapExit set to true, send message - * Exit(self, reason) to a. + * {'EXIT, self, reason} to a. *

*

* For each linked actor a with * trapExit set to false (default), * call a.exit(reason) if - * !reason.equals("normal"). + * reason != 'normal. *

*/ - def exit(reason: String): Nothing = self.exit(reason) + def exit(reason: AnyRef): Nothing = self.exit(reason) } /** @@ -569,7 +569,7 @@ trait Actor extends OutputChannel[Any] { } var trapExit = false - private[actors] var exitReason: String = "normal" + private[actors] var exitReason: AnyRef = 'normal private[actors] var exiting = false private[actors] var shouldExit = false @@ -581,17 +581,17 @@ trait Actor extends OutputChannel[Any] { *

* For each linked actor a with * trapExit set to true, send message - * Exit(self, reason) to a. + * {'EXIT, self, reason} to a. *

*

* For each linked actor a with * trapExit set to false (default), * call a.exit(reason) if - * !reason.equals("normal"). + * reason != 'normal. *

*/ - def exit(reason: String): Nothing = { - if (reason.equals("normal")) kill() + def exit(reason: AnyRef): Nothing = { + if (reason == 'normal) kill() // links if (!links.isEmpty) { exitReason = reason @@ -600,7 +600,7 @@ trait Actor extends OutputChannel[Any] { throw new ExitActorException } - def exit(): Nothing = exit("normal") + def exit(): Nothing = exit('normal) // Assume !links.isEmpty private[actors] def exitLinked() { @@ -615,11 +615,26 @@ trait Actor extends OutputChannel[Any] { }) } + // Assume !links.isEmpty + private[actors] def exitLinked(reason: AnyRef) { + exitReason = reason + exiting = true + // remove this from links + links = links.remove(this.==) + // exit linked processes + links.foreach((linked: Actor) => { + unlink(linked) + if (!linked.exiting) + linked.exit(this, exitReason) + }) + } + // Assume !this.exiting - private[actors] def exit(from: Actor, reason: String) { - if (trapExit) - this ! Exit(from, reason) - else if (!reason.equals("normal")) + private[actors] def exit(from: Actor, reason: AnyRef) { + if (trapExit) { + this ! {'EXIT, from, reason} + } + else if (reason != 'normal) this.synchronized { shouldExit = true exitReason = reason @@ -633,18 +648,6 @@ trait Actor extends OutputChannel[Any] { } -/** - * Messages of this type are sent to each actor a - * that is linked to an actor b whenever - * b terminates and a has - * trapExit set to true. - * - * @version 0.9.2 - * @author Philipp Haller - */ -case class Exit(from: Actor, reason: String) - - /** *

This object is used as the timeout pattern in * receiveWithin and reactWithin. diff --git a/src/actors/scala/actors/ActorProxy.scala b/src/actors/scala/actors/ActorProxy.scala index d0fb23d83b..0903e3daf2 100644 --- a/src/actors/scala/actors/ActorProxy.scala +++ b/src/actors/scala/actors/ActorProxy.scala @@ -33,18 +33,18 @@ private[actors] class ActorProxy(t: Thread) extends Actor { *

* For each linked actor a with * trapExit set to true, send message - * Exit(self, reason) to a. + * {'EXIT, self, reason} to a. *

*

* For each linked actor a with * trapExit set to false (default), * call a.exit(reason) if - * !reason.equals("normal"). + * reason != 'normal. *

* * @param reason the exit reason of the interrupted thread. */ - override def exit(reason: String): Nothing = { + override def exit(reason: AnyRef): Nothing = { kill() // links if (!links.isEmpty) { diff --git a/src/actors/scala/actors/Reaction.scala b/src/actors/scala/actors/Reaction.scala index fd3f8df0e9..931d2cd17b 100644 --- a/src/actors/scala/actors/Reaction.scala +++ b/src/actors/scala/actors/Reaction.scala @@ -67,10 +67,10 @@ private[actors] class Reaction(a: Actor, case _: SuspendActorException => { // do nothing (continuation is already saved) } - case _: Throwable => { + case t: Throwable => { // links if (!a.links.isEmpty) { - a.exitLinked() + a.exitLinked(t) } } } diff --git a/src/actors/scala/actors/remote/TcpService.scala b/src/actors/scala/actors/remote/TcpService.scala index 09fb80a80b..d17f072ecc 100644 --- a/src/actors/scala/actors/remote/TcpService.scala +++ b/src/actors/scala/actors/remote/TcpService.scala @@ -12,8 +12,7 @@ package scala.actors.remote -import java.lang.Thread -import java.lang.SecurityException +import java.lang.{Thread, SecurityException} import java.io.{BufferedReader, DataInputStream, DataOutputStream, IOException, InputStreamReader, OutputStreamWriter, @@ -34,7 +33,8 @@ object TcpService { } catch { case ioe: IOException => - // this happens when trying to open a socket twice at the same port + // this happens when trying to open a socket twice + // at the same port // try again generatePort case se: SecurityException => -- cgit v1.2.3