diff options
author | Philipp Haller <hallerp@gmail.com> | 2009-09-30 15:42:18 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2009-09-30 15:42:18 +0000 |
commit | 701cb3195d63591b583dbcf418a25f92da4f2005 (patch) | |
tree | 8abe14ca563fc9c793f08442cf5fe1624d00ad37 | |
parent | 5816ef2f97fe9bc574cc77dc48b20bc1c615eaf5 (diff) | |
download | scala-701cb3195d63591b583dbcf418a25f92da4f2005.tar.gz scala-701cb3195d63591b583dbcf418a25f92da4f2005.tar.bz2 scala-701cb3195d63591b583dbcf418a25f92da4f2005.zip |
Removed LightReaction. Simplified ActorTask.
-rw-r--r-- | src/actors/scala/actors/Actor.scala | 4 | ||||
-rw-r--r-- | src/actors/scala/actors/ActorTask.scala | 58 | ||||
-rw-r--r-- | src/actors/scala/actors/LightReaction.scala | 34 | ||||
-rw-r--r-- | src/actors/scala/actors/Reactor.scala | 23 | ||||
-rw-r--r-- | src/actors/scala/actors/ReactorTask.scala | 33 | ||||
-rw-r--r-- | src/actors/scala/actors/ReplyReactor.scala | 2 |
6 files changed, 39 insertions, 115 deletions
diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala index e4f93575f3..26b4661170 100644 --- a/src/actors/scala/actors/Actor.scala +++ b/src/actors/scala/actors/Actor.scala @@ -430,7 +430,7 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor { if (onSameThread) continuation(item._1) else - scheduleActor(null, item._1) + scheduleActor(continuation, item._1) } } @@ -843,7 +843,7 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor { if (isSuspended) resumeActor() else if (waitingFor ne waitingForNone) { - scheduleActor(null, null) + scheduleActor(continuation, null) } } } diff --git a/src/actors/scala/actors/ActorTask.scala b/src/actors/scala/actors/ActorTask.scala index 16c04aa34f..df248053e1 100644 --- a/src/actors/scala/actors/ActorTask.scala +++ b/src/actors/scala/actors/ActorTask.scala @@ -11,63 +11,23 @@ package scala.actors -import java.lang.Runnable -import java.util.concurrent.Callable - /** <p> - * The class <code>ActorTask</code>... + * The class <code>ActorTask</code>. * </p> * * @author Philipp Haller */ -private[actors] class ActorTask extends Callable[Unit] with Runnable { - - private var a: Actor = null - private var fun: () => Unit = null +private[actors] class ActorTask(actor: Actor, fun: () => Unit) extends ReactorTask[Actor](actor, fun) { - def this(a: Actor, fun: () => Unit) { - this() - this.a = a - this.fun = fun + protected override def beforeExecuting() { + if (actor.shouldExit) + actor.exit() } - def call() = run() - - def run() { - val saved = Actor.tl.get - Actor.tl set a - try { - if (a.shouldExit) // links - a.exit() - try { - try { - fun() - } catch { - case e: Exception if (a.exceptionHandler.isDefinedAt(e)) => - a.exceptionHandler(e) - } - } catch { - case _: KillActorException => - } - a.kill() - } - catch { - case _: SuspendActorException => { - // do nothing - } - case t: Exception => { - Debug.info(a+": caught "+t) - a.terminated() - // links - a.synchronized { - if (!a.links.isEmpty) - a.exitLinked(t) - } - } - } finally { - Actor.tl set saved - this.a = null - this.fun = null + protected override def afterExecuting(e: Exception) { + actor.synchronized { + if (!actor.links.isEmpty) + actor.exitLinked(e) } } diff --git a/src/actors/scala/actors/LightReaction.scala b/src/actors/scala/actors/LightReaction.scala deleted file mode 100644 index 557d313615..0000000000 --- a/src/actors/scala/actors/LightReaction.scala +++ /dev/null @@ -1,34 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2005-2009, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ - -// $Id$ - - -package scala.actors - -import java.lang.Runnable - -/** <p> - * The abstract class <code>LightReaction</code> associates - * an instance of a <code>Reactor</code> with a - * <a class="java/lang/Runnable" href="" target="contentFrame"> - * <code>java.lang.Runnable</code></a>. - * </p> - * - * @author Philipp Haller - */ -private[actors] class LightReaction(a: Reactor, f: PartialFunction[Any, Unit], msg: Any) extends ReactorTask(a, () => { - if (f == null) - a.act() - else - f(msg) -}) { - - def this(a: Reactor) = this(a, null, null) - -} diff --git a/src/actors/scala/actors/Reactor.scala b/src/actors/scala/actors/Reactor.scala index edc58c2ba5..63c9ff32bd 100644 --- a/src/actors/scala/actors/Reactor.scala +++ b/src/actors/scala/actors/Reactor.scala @@ -87,7 +87,7 @@ trait Reactor extends OutputChannel[Any] { if (onSameThread) continuation(item._1) else - scheduleActor(null, item._1) + scheduleActor(continuation, item._1) } def !(msg: Any) { @@ -107,7 +107,7 @@ trait Reactor extends OutputChannel[Any] { } } - // assume continuation has been set + // assume continuation != null private[actors] def searchMailbox(startMbox: MessageQueue, handlesMessage: Any => Boolean, resumeOnSameThread: Boolean) { @@ -145,19 +145,20 @@ trait Reactor extends OutputChannel[Any] { } /* This method is guaranteed to be executed from inside - an actors act method. + * an actors act method. + * + * assume handler != null */ - private[actors] def scheduleActor(f: PartialFunction[Any, Unit], msg: Any) = { - scheduler executeFromActor (new LightReaction(this, - if (f eq null) continuation else f, - msg)) + private[actors] def scheduleActor(handler: PartialFunction[Any, Unit], msg: Any) = { + val fun = () => handler(msg) + val task = new ReactorTask(this, fun) + scheduler executeFromActor task } def start(): Reactor = { - scheduler execute { - scheduler.newActor(this) - (new LightReaction(this)).run() - } + scheduler.newActor(this) + val task = new ReactorTask(this, () => act()) + scheduler execute task this } diff --git a/src/actors/scala/actors/ReactorTask.scala b/src/actors/scala/actors/ReactorTask.scala index 824e95090d..b29e770bc4 100644 --- a/src/actors/scala/actors/ReactorTask.scala +++ b/src/actors/scala/actors/ReactorTask.scala @@ -15,28 +15,19 @@ import java.lang.Runnable import java.util.concurrent.Callable /** <p> - * The class <code>ReactorTask</code>... + * The class <code>ReactorTask</code>. * </p> * * @author Philipp Haller */ -private[actors] class ReactorTask extends Callable[Unit] with Runnable { - - private var reactor: Reactor = null - private var fun: () => Unit = null - - def this(reactor: Reactor, fun: () => Unit) { - this() - this.reactor = reactor - this.fun = fun - } - - def call() = run() +private[actors] class ReactorTask[T <: Reactor](var reactor: T, var fun: () => Unit) + extends Callable[Unit] with Runnable { def run() { val saved = Actor.tl.get Actor.tl set reactor try { + beforeExecuting() try { try { fun() @@ -50,13 +41,13 @@ private[actors] class ReactorTask extends Callable[Unit] with Runnable { reactor.kill() } catch { - case _: SuspendActorException => { + case _: SuspendActorException => // do nothing (continuation is already saved) - } - case t: Exception => { - Debug.info(reactor+": caught "+t) + + case e: Exception => + Debug.info(reactor+": caught "+e) reactor.terminated() - } + afterExecuting(e) } finally { Actor.tl set saved this.reactor = null @@ -64,4 +55,10 @@ private[actors] class ReactorTask extends Callable[Unit] with Runnable { } } + def call() = run() + + protected def beforeExecuting() {} + + protected def afterExecuting(e: Exception) {} + } diff --git a/src/actors/scala/actors/ReplyReactor.scala b/src/actors/scala/actors/ReplyReactor.scala index be05c9cd35..9e59c4956d 100644 --- a/src/actors/scala/actors/ReplyReactor.scala +++ b/src/actors/scala/actors/ReplyReactor.scala @@ -57,7 +57,7 @@ trait ReplyReactor extends Reactor { if (onSameThread) continuation(item._1) else - scheduleActor(null, item._1) + scheduleActor(continuation, item._1) } } |