diff options
author | Philipp Haller <hallerp@gmail.com> | 2007-11-13 11:10:01 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2007-11-13 11:10:01 +0000 |
commit | 6ff4542f8bfde47588e5b641f39471756662bc08 (patch) | |
tree | 64e70fcbc923c4a1e836c6eefa5467bf35c6c8ce /src | |
parent | 5438ab13a944a0721816012a9be99a9d3141d7a9 (diff) | |
download | scala-6ff4542f8bfde47588e5b641f39471756662bc08.tar.gz scala-6ff4542f8bfde47588e5b641f39471756662bc08.tar.bz2 scala-6ff4542f8bfde47588e5b641f39471756662bc08.zip |
towards automatic termination of remote actors
Diffstat (limited to 'src')
-rw-r--r-- | src/actors/scala/actors/Actor.scala | 1 | ||||
-rw-r--r-- | src/actors/scala/actors/Reaction.scala | 2 | ||||
-rw-r--r-- | src/actors/scala/actors/remote/RemoteActor.scala | 14 |
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() + } + } } /** |