diff options
-rw-r--r-- | src/actors/scala/actors/Debug.scala | 46 | ||||
-rw-r--r-- | src/actors/scala/actors/Reaction.scala | 1 | ||||
-rw-r--r-- | src/actors/scala/actors/Scheduler.scala | 14 |
3 files changed, 61 insertions, 0 deletions
diff --git a/src/actors/scala/actors/Debug.scala b/src/actors/scala/actors/Debug.scala new file mode 100644 index 0000000000..9807f2b620 --- /dev/null +++ b/src/actors/scala/actors/Debug.scala @@ -0,0 +1,46 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2005-2006, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +// $Id: Debug.scala 8192 2006-07-19 09:52:31Z dubochet $ + +package scala.actors + +/** + * @author Philipp Haller + */ +object Debug { + var lev = 2 + + def level = lev + def level_= (lev: int) = { + this.lev = lev + } + + def info(s: String) = + if (lev > 2) System.out.println("Info: " + s) + def warning(s: String) = + if (lev > 1) System.err.println("Warning: " + s) + def error(s: String) = + if (lev > 0) System.err.println("Error: " + s) +} + +class Debug(tag: String) { + var lev = 2 + + def level = lev + def level_= (lev: int) = { + this.lev = lev + } + + def info(s: String) = + if (lev > 2) System.out.println(tag + " (info): " + s) + def warning(s: String) = + if (lev > 1) System.err.println(tag + " (warn): " + s) + def error(s: String) = + if (lev > 0) System.err.println(tag + " (erro): " + s) +} diff --git a/src/actors/scala/actors/Reaction.scala b/src/actors/scala/actors/Reaction.scala index 62d7e2778b..79e54a52d7 100644 --- a/src/actors/scala/actors/Reaction.scala +++ b/src/actors/scala/actors/Reaction.scala @@ -54,6 +54,7 @@ private[actors] class StartTask(a: Actor) extends Reaction { } catch { case ie: InterruptedException => { + // TODO: use Debug ie.printStackTrace() a.exitLinked() } diff --git a/src/actors/scala/actors/Scheduler.scala b/src/actors/scala/actors/Scheduler.scala index c79f9c49ab..a206a7899b 100644 --- a/src/actors/scala/actors/Scheduler.scala +++ b/src/actors/scala/actors/Scheduler.scala @@ -221,6 +221,20 @@ class TickedScheduler extends Thread with IScheduler { newWorker.start() } } // tasks.length > 0 + else { + Debug.info("task queue empty, checking...") + // 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 + worker.running = false + worker.interrupt() + } + throw new QuitException + } + } } // sync } // while (!terminating) |