summaryrefslogtreecommitdiff
path: root/src/actors
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2009-09-30 15:42:18 +0000
committerPhilipp Haller <hallerp@gmail.com>2009-09-30 15:42:18 +0000
commit701cb3195d63591b583dbcf418a25f92da4f2005 (patch)
tree8abe14ca563fc9c793f08442cf5fe1624d00ad37 /src/actors
parent5816ef2f97fe9bc574cc77dc48b20bc1c615eaf5 (diff)
downloadscala-701cb3195d63591b583dbcf418a25f92da4f2005.tar.gz
scala-701cb3195d63591b583dbcf418a25f92da4f2005.tar.bz2
scala-701cb3195d63591b583dbcf418a25f92da4f2005.zip
Removed LightReaction. Simplified ActorTask.
Diffstat (limited to 'src/actors')
-rw-r--r--src/actors/scala/actors/Actor.scala4
-rw-r--r--src/actors/scala/actors/ActorTask.scala58
-rw-r--r--src/actors/scala/actors/LightReaction.scala34
-rw-r--r--src/actors/scala/actors/Reactor.scala23
-rw-r--r--src/actors/scala/actors/ReactorTask.scala33
-rw-r--r--src/actors/scala/actors/ReplyReactor.scala2
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)
}
}