summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2006-11-08 17:23:21 +0000
committerPhilipp Haller <hallerp@gmail.com>2006-11-08 17:23:21 +0000
commitc3ff16d17e367e2d69646285a7a049b0f076d04e (patch)
tree36c7e3e4e296fb6142bbbf374fc245334f782c86
parent69a0c3e30a38537bd986dfb1b8327807c2d993ce (diff)
downloadscala-c3ff16d17e367e2d69646285a7a049b0f076d04e.tar.gz
scala-c3ff16d17e367e2d69646285a7a049b0f076d04e.tar.bz2
scala-c3ff16d17e367e2d69646285a7a049b0f076d04e.zip
added termination check in scheduler.
-rw-r--r--src/actors/scala/actors/Debug.scala46
-rw-r--r--src/actors/scala/actors/Reaction.scala1
-rw-r--r--src/actors/scala/actors/Scheduler.scala14
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)