summaryrefslogtreecommitdiff
path: root/src/actors
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2007-01-23 14:12:33 +0000
committerPhilipp Haller <hallerp@gmail.com>2007-01-23 14:12:33 +0000
commit18e6056e0690daad70d4cd49c0ae9b6ed182dca2 (patch)
treed08b3a00607f7663bb454165577cf8bb6f5ded3a /src/actors
parent634c658057e7b3b83d2167d5db8951a8de4cd1df (diff)
downloadscala-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.scala6
-rw-r--r--src/actors/scala/actors/ActorProxy.scala13
-rw-r--r--src/actors/scala/actors/JDK5Scheduler.scala13
-rw-r--r--src/actors/scala/actors/Reaction.scala8
-rw-r--r--src/actors/scala/actors/Scheduler.scala6
-rw-r--r--src/actors/scala/actors/TickedScheduler.scala4
-rw-r--r--src/actors/scala/actors/TimerThread.scala2
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
*/