diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/actors/scala/actors/MessageQueue.scala | 70 | ||||
-rw-r--r-- | src/library/scala/runtime/RichInt.scala | 17 |
2 files changed, 41 insertions, 46 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 diff --git a/src/library/scala/runtime/RichInt.scala b/src/library/scala/runtime/RichInt.scala index 0c950cef8d..47d4b458c1 100644 --- a/src/library/scala/runtime/RichInt.scala +++ b/src/library/scala/runtime/RichInt.scala @@ -32,23 +32,6 @@ final class RichInt(val start: Int) extends Proxy with Ordered[Int] { def max(that: Int): Int = if (start > that) start else that def abs: Int = if (start < 0) -start else start - /** Execute a block of code this many times. - * For instance: 5 times { println("hello") } - * - * N.B. this way of repeatedly executing an action has - * far superior performance to any other approach in the - * library. It's not just syntactic sugar, it is faster - * than anything but a locally implemented while loop and - * of course less error prone than the while loop. - */ - def times(body: => Unit) { - var i = 0 - while (i < start) { - body - i += 1 - } - } - def toBinaryString: String = java.lang.Integer.toBinaryString(start) def toHexString: String = java.lang.Integer.toHexString(start) def toOctalString: String = java.lang.Integer.toOctalString(start) |