summaryrefslogtreecommitdiff
path: root/src/actors
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2007-04-20 12:47:54 +0000
committerPhilipp Haller <hallerp@gmail.com>2007-04-20 12:47:54 +0000
commit30cac1fb061764efb1bf633b7e1b0849b0fff8d9 (patch)
treed6d016a2f76b4e61a7db9f1057dce25e164c37de /src/actors
parentaf87cfc074b4aa38ee3df7bc9d5a53c0f6eb64c5 (diff)
downloadscala-30cac1fb061764efb1bf633b7e1b0849b0fff8d9.tar.gz
scala-30cac1fb061764efb1bf633b7e1b0849b0fff8d9.tar.bz2
scala-30cac1fb061764efb1bf633b7e1b0849b0fff8d9.zip
Fixed Actor.exit, added continue for loop { }.
Diffstat (limited to 'src/actors')
-rw-r--r--src/actors/scala/actors/Actor.scala49
-rw-r--r--src/actors/scala/actors/ActorProxy.scala2
-rw-r--r--src/actors/scala/actors/Reaction.scala2
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 =>