diff options
author | Philipp Haller <hallerp@gmail.com> | 2007-01-23 14:12:33 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2007-01-23 14:12:33 +0000 |
commit | 18e6056e0690daad70d4cd49c0ae9b6ed182dca2 (patch) | |
tree | d08b3a00607f7663bb454165577cf8bb6f5ded3a /src/actors | |
parent | 634c658057e7b3b83d2167d5db8951a8de4cd1df (diff) | |
download | scala-18e6056e0690daad70d4cd49c0ae9b6ed182dca2.tar.gz scala-18e6056e0690daad70d4cd49c0ae9b6ed182dca2.tar.bz2 scala-18e6056e0690daad70d4cd49c0ae9b6ed182dca2.zip |
Fixed bug (self not updated correctly).
Diffstat (limited to 'src/actors')
-rw-r--r-- | src/actors/scala/actors/Actor.scala | 6 | ||||
-rw-r--r-- | src/actors/scala/actors/ActorProxy.scala | 13 | ||||
-rw-r--r-- | src/actors/scala/actors/JDK5Scheduler.scala | 13 | ||||
-rw-r--r-- | src/actors/scala/actors/Reaction.scala | 8 | ||||
-rw-r--r-- | src/actors/scala/actors/Scheduler.scala | 6 | ||||
-rw-r--r-- | src/actors/scala/actors/TickedScheduler.scala | 4 | ||||
-rw-r--r-- | src/actors/scala/actors/TimerThread.scala | 2 |
7 files changed, 21 insertions, 31 deletions
diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala index 7054d6735b..826535d451 100644 --- a/src/actors/scala/actors/Actor.scala +++ b/src/actors/scala/actors/Actor.scala @@ -39,7 +39,6 @@ object Actor { var a = tl.get.asInstanceOf[Actor] if (null eq a) { a = new ActorProxy(currentThread) - //Debug.info("created "+a+" for "+currentThread) tl.set(a) } a @@ -321,11 +320,8 @@ trait Actor extends OutputChannel[Any] { isSuspended = true received = None suspendActorFor(msec) - Debug.info("received: "+received) if (received.isEmpty) { - Debug.info("no message received after "+msec+" millis") if (f.isDefinedAt(TIMEOUT)) { - Debug.info("executing TIMEOUT action") waitingFor = waitingForNone isSuspended = false val result = f(TIMEOUT) @@ -638,7 +634,7 @@ trait Actor extends OutputChannel[Any] { * <code>b</code> terminates and <code>a</code> has * <code>trapExit</code> set to <code>true</code>. * - * @version 0.9.0 + * @version 0.9.2 * @author Philipp Haller */ case class Exit(from: Actor, reason: String) diff --git a/src/actors/scala/actors/ActorProxy.scala b/src/actors/scala/actors/ActorProxy.scala index 0cdbcde587..d0fb23d83b 100644 --- a/src/actors/scala/actors/ActorProxy.scala +++ b/src/actors/scala/actors/ActorProxy.scala @@ -18,14 +18,12 @@ import java.lang.Thread * The class <code>ActorProxy</code>provides a dynamic actor proxy for normal * Java threads. * - * @version 0.9.0 + * @version 0.9.2 * @author Philipp Haller */ private[actors] class ActorProxy(t: Thread) extends Actor { - /** - */ - def act(): Unit = {} + def act() {} /** * <p> @@ -48,8 +46,11 @@ private[actors] class ActorProxy(t: Thread) extends Actor { */ override def exit(reason: String): Nothing = { kill() - exitReason = reason - exitLinked() + // links + if (!links.isEmpty) { + exitReason = reason + exitLinked() + } throw new InterruptedException } } diff --git a/src/actors/scala/actors/JDK5Scheduler.scala b/src/actors/scala/actors/JDK5Scheduler.scala index e56a891385..8f5d9a611e 100644 --- a/src/actors/scala/actors/JDK5Scheduler.scala +++ b/src/actors/scala/actors/JDK5Scheduler.scala @@ -28,8 +28,6 @@ class TaskRejectedHandler(sched: JDK5Scheduler) extends RejectedExecutionHandler */ class JDK5Scheduler(initCoreSize: int, maxSize: int) extends Thread with IScheduler { - Debug.info("using JDK5Scheduler("+initCoreSize+", "+maxSize+")") - /* Note: * When using an unbounded queue such as a * LinkedBlockingQueue, the executor never creates @@ -53,6 +51,8 @@ class JDK5Scheduler(initCoreSize: int, maxSize: int) extends Thread with ISchedu private var lastActivity = Platform.currentTime + private var submittedTasks = 0 + private var pendingReactions = 0 def pendReaction: unit = synchronized { pendingReactions = pendingReactions + 1 @@ -65,6 +65,7 @@ class JDK5Scheduler(initCoreSize: int, maxSize: int) extends Thread with ISchedu def start(task: Reaction): unit = synchronized { pendingReactions = pendingReactions + 1 + submittedTasks = submittedTasks + 1 execute(task) } @@ -94,9 +95,6 @@ class JDK5Scheduler(initCoreSize: int, maxSize: int) extends Thread with ISchedu if (terminating) throw new QuitException } - //Debug.info("tasks.length: "+executor.getQueue().size()) - //Debug.info("pendingReactions: "+pendingReactions) - // check if we need more threads if (executor.getQueue().size() > 0 && Platform.currentTime - lastActivity >= TICK_FREQ @@ -109,11 +107,9 @@ class JDK5Scheduler(initCoreSize: int, maxSize: int) extends Thread with ISchedu if (pendingReactions == 0) { // if all worker threads idle terminate if (executor.getActiveCount() == 0) { - //Debug.info("all threads idle, terminating") executor.shutdown() // terminate timer thread TimerThread.t.interrupt() - //Debug.info("threads used: "+coreSize) throw new QuitException } } @@ -131,6 +127,7 @@ class JDK5Scheduler(initCoreSize: int, maxSize: int) extends Thread with ISchedu * @param item the task to be executed. */ def execute(item: Reaction): unit = synchronized { + submittedTasks = submittedTasks + 1 executor.execute(item) } @@ -150,11 +147,9 @@ class JDK5Scheduler(initCoreSize: int, maxSize: int) extends Thread with ISchedu /** Shuts down all idle worker threads. */ def shutdown(): unit = synchronized { - Debug.info("Shutting down scheduler...") terminating = true executor.shutdown() // terminate timer thread TimerThread.t.interrupt() - Console.println("threads used: "+coreSize) } } diff --git a/src/actors/scala/actors/Reaction.scala b/src/actors/scala/actors/Reaction.scala index e8d9ee7c72..64265a49bd 100644 --- a/src/actors/scala/actors/Reaction.scala +++ b/src/actors/scala/actors/Reaction.scala @@ -34,6 +34,7 @@ private[actors] class Reaction(a: Actor, /*val t = currentThread val saved = Actor.selfs.get(t).asInstanceOf[Actor] Actor.selfs.put(t, a)*/ + val saved = Actor.tl.get.asInstanceOf[Actor] Actor.tl.set(a) Scheduler.unPendReaction a.isDetached = false @@ -64,9 +65,10 @@ private[actors] class Reaction(a: Actor, } } } - /*finally { - Actor.selfs.put(t, saved) - }*/ + finally { + //Actor.selfs.put(t, saved) + Actor.tl.set(saved) + } } } diff --git a/src/actors/scala/actors/Scheduler.scala b/src/actors/scala/actors/Scheduler.scala index 0f3d2424fe..30bb601645 100644 --- a/src/actors/scala/actors/Scheduler.scala +++ b/src/actors/scala/actors/Scheduler.scala @@ -82,7 +82,7 @@ object Scheduler { * This abstract class provides a common interface for all * schedulers used to execute reactors. * - * @version 0.9.0 + * @version 0.9.2 * @author Philipp Haller */ trait IScheduler { @@ -111,7 +111,7 @@ trait IScheduler { * This scheduler executes the tasks of a reactor on a single * thread (the current thread). * - * @version 0.9.0 + * @version 0.9.2 * @author Philipp Haller */ class SingleThreadedScheduler extends IScheduler { @@ -201,7 +201,7 @@ class QuitException extends Throwable { * execution. QED * </p> * - * @version 0.9.0 + * @version 0.9.2 * @author Philipp Haller */ class WorkerThread(sched: IScheduler) extends Thread { diff --git a/src/actors/scala/actors/TickedScheduler.scala b/src/actors/scala/actors/TickedScheduler.scala index 48326aaaf9..333c1aaa63 100644 --- a/src/actors/scala/actors/TickedScheduler.scala +++ b/src/actors/scala/actors/TickedScheduler.scala @@ -72,9 +72,6 @@ class TickedScheduler extends Thread with IScheduler { if (terminating) throw new QuitException } - //Debug.info("tasks.length: "+tasks.length) - //Debug.info("pendingReactions: "+pendingReactions) - if (tasks.length > 0) { // check if we need more threads if (Platform.currentTime - lastActivity >= TICK_FREQ) { @@ -92,7 +89,6 @@ class TickedScheduler extends Thread with IScheduler { if (pendingReactions == 0) { // if all worker threads idle terminate if (workers.length == idle.length) { - Debug.info("all threads idle, terminating") val idleThreads = idle.elements while (idleThreads.hasNext) { val worker = idleThreads.next diff --git a/src/actors/scala/actors/TimerThread.scala b/src/actors/scala/actors/TimerThread.scala index c835865002..b0a38ca267 100644 --- a/src/actors/scala/actors/TimerThread.scala +++ b/src/actors/scala/actors/TimerThread.scala @@ -22,7 +22,7 @@ import scala.collection.mutable.PriorityQueue * Note that the library deletes non-received <code>TIMEOUT</code> message if a * message is received before the time-out occurs. * - * @version 0.9.0 + * @version 0.9.2 * @author Sebastien Noir, Philipp Haller */ |