summaryrefslogtreecommitdiff
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
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..."
-rw-r--r--src/actors/scala/actors/MessageQueue.scala70
-rw-r--r--src/library/scala/runtime/RichInt.scala17
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)