From fd1eba71450b3d60fd02dba22f951a32485629d8 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Sat, 5 Sep 2009 11:23:43 +0000 Subject: 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..." --- src/actors/scala/actors/MessageQueue.scala | 70 +++++++++++++++++------------- 1 file changed, 41 insertions(+), 29 deletions(-) (limited to 'src/actors') 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 MessageQueue 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 -- cgit v1.2.3