summaryrefslogtreecommitdiff
path: root/src/actors
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2007-11-13 11:10:01 +0000
committerPhilipp Haller <hallerp@gmail.com>2007-11-13 11:10:01 +0000
commit6ff4542f8bfde47588e5b641f39471756662bc08 (patch)
tree64e70fcbc923c4a1e836c6eefa5467bf35c6c8ce /src/actors
parent5438ab13a944a0721816012a9be99a9d3141d7a9 (diff)
downloadscala-6ff4542f8bfde47588e5b641f39471756662bc08.tar.gz
scala-6ff4542f8bfde47588e5b641f39471756662bc08.tar.bz2
scala-6ff4542f8bfde47588e5b641f39471756662bc08.zip
towards automatic termination of remote actors
Diffstat (limited to 'src/actors')
-rw-r--r--src/actors/scala/actors/Actor.scala1
-rw-r--r--src/actors/scala/actors/Reaction.scala2
-rw-r--r--src/actors/scala/actors/remote/RemoteActor.scala14
3 files changed, 15 insertions, 2 deletions
diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala
index 55eb9ce314..0855866f0c 100644
--- a/src/actors/scala/actors/Actor.scala
+++ b/src/actors/scala/actors/Actor.scala
@@ -811,6 +811,7 @@ trait Actor extends OutputChannel[Any] {
// links
if (!links.isEmpty)
exitLinked()
+ kill()
throw new ExitActorException
}
diff --git a/src/actors/scala/actors/Reaction.scala b/src/actors/scala/actors/Reaction.scala
index 9f46e9c0ce..2fde1a8a37 100644
--- a/src/actors/scala/actors/Reaction.scala
+++ b/src/actors/scala/actors/Reaction.scala
@@ -51,7 +51,7 @@ private[actors] class ExitActorException extends Throwable
a.act()
else
f(msg)
- a.kill(); a.exit()
+ a.exit()
}
}
catch {
diff --git a/src/actors/scala/actors/remote/RemoteActor.scala b/src/actors/scala/actors/remote/RemoteActor.scala
index 7312cea4ba..99865ec5a5 100644
--- a/src/actors/scala/actors/remote/RemoteActor.scala
+++ b/src/actors/scala/actors/remote/RemoteActor.scala
@@ -51,7 +51,19 @@ object RemoteActor {
*/
def alive(port: Int): Unit = synchronized {
val serv = TcpService(port)
- kernels += Actor.self -> serv.kernel
+ val kern = serv.kernel
+ val s = Actor.self
+ kernels += s -> kern
+ Debug.info("registering kill handler")
+ s.kill = () => {
+ Debug.info("alive actor "+s+" terminated")
+ kernels -= s
+ if (kernels.isEmpty) {
+ Debug.info("interrupting "+serv)
+ // terminate TcpService
+ serv.interrupt()
+ }
+ }
}
/**