summaryrefslogtreecommitdiff
path: root/src/actors
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2009-09-05 11:23:43 +0000
committerPaul Phillips <paulp@improving.org>2009-09-05 11:23:43 +0000
commitfd1eba71450b3d60fd02dba22f951a32485629d8 (patch)
tree7530ef1f6190a66b4734c63760aee1afd3bb8e96 /src/actors
parent0ae9ca5d2406efe2df10824beb192d958ee2c82e (diff)
downloadscala-fd1eba71450b3d60fd02dba22f951a32485629d8.tar.gz
scala-fd1eba71450b3d60fd02dba22f951a32485629d8.tar.bz2
scala-fd1eba71450b3d60fd02dba22f951a32485629d8.zip
Minor refinements to recent patches, and the re...
Minor refinements to recent patches, and the reversion of times. "It was the best of times... it was the reversion of times..."
Diffstat (limited to 'src/actors')
-rw-r--r--src/actors/scala/actors/MessageQueue.scala70
1 files changed, 41 insertions, 29 deletions
diff --git a/src/actors/scala/actors/MessageQueue.scala b/src/actors/scala/actors/MessageQueue.scala
index 4b55fab21d..6e69f1cdac 100644
--- a/src/actors/scala/actors/MessageQueue.scala
+++ b/src/actors/scala/actors/MessageQueue.scala
@@ -18,20 +18,11 @@ package scala.actors
* @author Philipp Haller
*/
@serializable
-class MessageQueueElement(var msg: Any, var session: OutputChannel[Any], var next: MessageQueueElement) {
+class MessageQueueElement(val msg: Any, val session: OutputChannel[Any], var next: MessageQueueElement) {
def this() = this(null, null, null)
def this(msg: Any, session: OutputChannel[Any]) = this(msg, session, null)
}
-object MessageQueue {
- // for tracing purposes
- private var queueNumberAssigner = 0
- private def getQueueNumber = synchronized {
- queueNumberAssigner += 1
- queueNumberAssigner
- }
-}
-
/**
* The class <code>MessageQueue</code> provides an efficient
* implementation of a message queue specialized for this actor
@@ -42,13 +33,9 @@ object MessageQueue {
* @author Philipp Haller
*/
@serializable
-class MessageQueue(label: String) {
- def this() = this("Unlabelled")
- private val queueNumber = MessageQueue.getQueueNumber
- private var trace = false // set to true to print out all appends/removes
-
- private var first: MessageQueueElement = null
- private var last: MessageQueueElement = null // last eq null iff list is empty
+class MessageQueue(protected val label: String) {
+ protected var first: MessageQueueElement = null
+ protected var last: MessageQueueElement = null // last eq null iff list is empty
private var _size = 0
def size = _size
@@ -60,9 +47,6 @@ class MessageQueue(label: String) {
def append(msg: Any, session: OutputChannel[Any]) {
changeSize(1) // size always increases by 1
- if (trace)
- printQueue("APPEND %s" format msg)
-
val el = new MessageQueueElement(msg, session)
if (isEmpty) first = el
@@ -100,12 +84,7 @@ class MessageQueue(label: String) {
var curr = first
while (curr != null)
- if (test(curr.msg)) {
- if (trace)
- printQueue("GET %s" format curr.msg)
-
- return Some(curr.msg) // early return
- }
+ if (test(curr.msg)) return Some(curr.msg) // early return
else curr = curr.next
None
@@ -123,9 +102,6 @@ class MessageQueue(label: String) {
var pos = 0
def foundMsg(x: MessageQueueElement) = {
- if (trace)
- printQueue("REMOVE %s" format x.msg)
-
changeSize(-1)
Some(x)
}
@@ -165,6 +141,33 @@ class MessageQueue(label: String) {
None
}
}
+}
+
+/** Debugging trait.
+ */
+private[actors] trait MessageQueueTracer extends MessageQueue
+{
+ private val queueNumber = MessageQueueTracer.getQueueNumber
+
+ override def append(msg: Any, session: OutputChannel[Any]) {
+ super.append(msg, session)
+ printQueue("APPEND %s" format msg)
+ }
+ override def get(n: Int)(p: Any => Boolean): Option[Any] = {
+ val res = super.get(n)(p)
+ printQueue("GET %s" format res)
+ res
+ }
+ override def remove(n: Int)(p: Any => Boolean): Option[(Any, OutputChannel[Any])] = {
+ val res = super.remove(n)(p)
+ printQueue("REMOVE %s" format res)
+ res
+ }
+ override def extractFirst(p: Any => Boolean): MessageQueueElement = {
+ val res = super.extractFirst(p)
+ printQueue("EXTRACT_FIRST %s" format res)
+ res
+ }
private def printQueue(msg: String) = {
def firstMsg = if (first eq null) "null" else first.msg
@@ -173,4 +176,13 @@ class MessageQueue(label: String) {
println("[%s size=%d] [%s] first = %s, last = %s".format(this, size, msg, firstMsg, lastMsg))
}
override def toString() = "%s:%d".format(label, queueNumber)
+}
+
+object MessageQueueTracer {
+ // for tracing purposes
+ private var queueNumberAssigner = 0
+ private def getQueueNumber = synchronized {
+ queueNumberAssigner += 1
+ queueNumberAssigner
+ }
} \ No newline at end of file