diff options
author | Philipp Haller <hallerp@gmail.com> | 2008-02-04 10:44:05 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2008-02-04 10:44:05 +0000 |
commit | 5295a1a8caa8b67e9492ad2882d857ff899eb527 (patch) | |
tree | 2dab7941dda34abb3a8dc74a8c6d17be1e350f1b /src | |
parent | d8e9f6cd938ef9f4b8eb24c5e89d62accd1a310c (diff) | |
download | scala-5295a1a8caa8b67e9492ad2882d857ff899eb527.tar.gz scala-5295a1a8caa8b67e9492ad2882d857ff899eb527.tar.bz2 scala-5295a1a8caa8b67e9492ad2882d857ff899eb527.zip |
Fixed #219
Diffstat (limited to 'src')
-rw-r--r-- | src/actors/scala/actors/FJTaskScheduler2.scala | 32 | ||||
-rw-r--r-- | src/actors/scala/actors/Reaction.scala | 16 | ||||
-rw-r--r-- | src/actors/scala/actors/remote/RemoteActor.scala | 11 |
3 files changed, 52 insertions, 7 deletions
diff --git a/src/actors/scala/actors/FJTaskScheduler2.scala b/src/actors/scala/actors/FJTaskScheduler2.scala index 848eebe169..382aee5f54 100644 --- a/src/actors/scala/actors/FJTaskScheduler2.scala +++ b/src/actors/scala/actors/FJTaskScheduler2.scala @@ -17,6 +17,8 @@ import java.lang.{Runnable, Thread, InterruptedException, System, Runtime} import scala.collection.Set import scala.collection.mutable.{ArrayBuffer, Buffer, HashMap, Queue, Stack, HashSet} +import scala.ref._ + /** * FJTaskScheduler2 * @@ -118,6 +120,29 @@ class FJTaskScheduler2 extends Thread with IScheduler { } if (!suspending) { + + // check whether some actors have become + // unreachable + /*def drainRefQ: Unit = + refQ.poll match { + case None => + // do nothing + case refWrapper => + refWrapper.get match { + case None => + // can't get hold of the actor + // count down anyways + unPendReaction + // continue draining + drainRefQ + case Some(a) => + Debug.info(this+": actor is unreachable: "+a) + unPendReaction + // continue draining + drainRefQ + } + }*/ + // check if we need more threads if (Platform.currentTime - lastActivity >= TICK_FREQ && coreSize < maxSize @@ -161,7 +186,14 @@ class FJTaskScheduler2 extends Thread with IScheduler { executor.execute(task) } + //private val refQ = new ReferenceQueue[Actor] + //private var storedRefs: List[WeakReference[Actor]] = List() + def start(task: Runnable) { + /*if (task.isInstanceOf[Reaction]) { + val reaction = task.asInstanceOf[Reaction] + storedRefs = new WeakReference(reaction.a, refQ) :: storedRefs + }*/ pendReaction executor.execute(task) } diff --git a/src/actors/scala/actors/Reaction.scala b/src/actors/scala/actors/Reaction.scala index 8807efa074..cec1cd9bf3 100644 --- a/src/actors/scala/actors/Reaction.scala +++ b/src/actors/scala/actors/Reaction.scala @@ -48,9 +48,19 @@ private[actors] class KillActorException extends Throwable { * @version 0.9.10 * @author Philipp Haller */ -/*private[actors]*/ class Reaction(a: Actor, - f: PartialFunction[Any, Unit], - msg: Any) extends Runnable { +class Reaction extends Runnable { + + private[actors] var a: Actor = _ + private var f: PartialFunction[Any, Unit] = _ + private var msg: Any = _ + + def this(a: Actor, f: PartialFunction[Any, Unit], msg: Any) = { + this() + this.a = a + this.f = f + this.msg = msg + } + def this(a: Actor) = this(a, null, null) def run() { diff --git a/src/actors/scala/actors/remote/RemoteActor.scala b/src/actors/scala/actors/remote/RemoteActor.scala index b1a2587aa1..f69acaa4ea 100644 --- a/src/actors/scala/actors/remote/RemoteActor.scala +++ b/src/actors/scala/actors/remote/RemoteActor.scala @@ -50,6 +50,10 @@ object RemoteActor { * <code>port</code>. */ def alive(port: Int): Unit = synchronized { + createKernelOnPort(port) + } + + def createKernelOnPort(port: Int): NetKernel = { val serv = TcpService(port) val kern = serv.kernel val s = Actor.self @@ -64,6 +68,8 @@ object RemoteActor { kern.terminate() } } + + kern } /** @@ -87,10 +93,7 @@ object RemoteActor { case None => // establish remotely accessible // return path (sender) - val serv = new TcpService(TcpService.generatePort) - serv.start() - kernels += Pair(Actor.self, serv.kernel) - serv.kernel + createKernelOnPort(TcpService.generatePort) case Some(k) => k } |