summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2004-01-09 15:00:41 +0000
committerMartin Odersky <odersky@gmail.com>2004-01-09 15:00:41 +0000
commit2f88fe7918a98e0e076fc3d44e9b8ca646c64c1f (patch)
tree629412ad71ebcaa3a27e50f9c82bf4be62af7ccc
parent253a192ede3e994d6c832c124c7c02fb551d1006 (diff)
downloadscala-2f88fe7918a98e0e076fc3d44e9b8ca646c64c1f.tar.gz
scala-2f88fe7918a98e0e076fc3d44e9b8ca646c64c1f.tar.bz2
scala-2f88fe7918a98e0e076fc3d44e9b8ca646c64c1f.zip
*** empty log message ***
-rw-r--r--doc/reference/ScalaByExample.tex22
-rw-r--r--sources/scala/concurrent/Actor.scala6
-rw-r--r--sources/scala/concurrent/Channel.scala11
-rw-r--r--sources/scala/concurrent/LinkedList.scala12
-rw-r--r--test/files/pos/MailBox.scala18
-rw-r--r--test/pos/MailBox.scala18
6 files changed, 51 insertions, 36 deletions
diff --git a/doc/reference/ScalaByExample.tex b/doc/reference/ScalaByExample.tex
index 850cc53eec..90c45145a3 100644
--- a/doc/reference/ScalaByExample.tex
+++ b/doc/reference/ScalaByExample.tex
@@ -6387,13 +6387,6 @@ lists:
class LinkedList[a] {
var elem: a = _;
var next: LinkedList[a] = null;
- def insert(elem: a): LinkedList[a] = {
- val nx = new LinkedList[a];
- nx.elem = a;
- nx.next = next;
- next = nx;
- next
- }
}
\end{lstlisting}
To facilitate insertion and deletion of elements into linked lists,
@@ -6409,8 +6402,12 @@ incrementing the \code{nreaders} field and waiting to be notified.
package scala.concurrent;
class Channel[a] with Monitor {
+ class LinkedList[a] {
+ var elem: a = _;
+ var next: LinkedList[a] = null;
+ }
private var written = new LinkedList[a];
- private var lastWritten = written;
+ private var lastWritten = new LinkedList[a];
private var nreaders = 0;
def write(x: a) = synchronized {
@@ -6424,8 +6421,9 @@ class Channel[a] with Monitor {
if (written.next == null) {
nreaders = nreaders + 1; wait(); nreaders = nreaders - 1;
}
+ val x = written.elem;
written = written.next;
- written.elem;
+ x
}
}
\end{lstlisting}
@@ -6712,17 +6710,17 @@ forwards all communication calls to an internal mailbox.
\begin{lstlisting}
abstract class Actor extends Thread {
- type Message = Any;
+ type Message = AnyRef;
private val mb = new MailBox;
def send(msg: Message): unit =
mb.send(msg);
- protected def receive[a](f: PartialFunction[Message, a]): a =
+ def receive[a](f: PartialFunction[Message, a]): a =
mb.receive(f);
- protected def receiveWithin[a](msec: long)(f: PartialFunction[Message, a]): a =
+ def receiveWithin[a](msec: long)(f: PartialFunction[Message, a]): a =
mb.receiveWithin(msec)(f);
}
\end{lstlisting}
diff --git a/sources/scala/concurrent/Actor.scala b/sources/scala/concurrent/Actor.scala
index c86fd5dfb7..dd4cee26d2 100644
--- a/sources/scala/concurrent/Actor.scala
+++ b/sources/scala/concurrent/Actor.scala
@@ -2,17 +2,17 @@ package scala.concurrent;
abstract class Actor extends Thread() {
- type Message = Any;
+ type Message = AnyRef;
private val mb = new MailBox;
def send(msg: Message): unit =
mb.send(msg);
- protected def receive[a](f: PartialFunction[Message, a]): a =
+ def receive[a](f: PartialFunction[Message, a]): a =
mb.receive(f);
- protected def receiveWithin[a](msec: long)(f: PartialFunction[Message, a]): a =
+ def receiveWithin[a](msec: long)(f: PartialFunction[Message, a]): a =
mb.receiveWithin(msec)(f);
}
diff --git a/sources/scala/concurrent/Channel.scala b/sources/scala/concurrent/Channel.scala
index b89e20f065..8c4faa1b61 100644
--- a/sources/scala/concurrent/Channel.scala
+++ b/sources/scala/concurrent/Channel.scala
@@ -1,14 +1,18 @@
package scala.concurrent;
class Channel[a] with Monitor {
+ class LinkedList[a] {
+ var elem: a = _;
+ var next: LinkedList[a] = null;
+ }
private var written = new LinkedList[a];
- private var lastWritten = written;
+ private var lastWritten = new LinkedList[a];
private var nreaders = 0;
def write(x: a) = synchronized {
+ lastWritten.elem = x;
lastWritten.next = new LinkedList[a];
lastWritten = lastWritten.next;
- lastWritten.elem = x;
if (nreaders > 0) notify();
}
@@ -16,7 +20,8 @@ class Channel[a] with Monitor {
if (written.next == null) {
nreaders = nreaders + 1; wait(); nreaders = nreaders - 1;
}
+ val x = written.elem;
written = written.next;
- written.elem;
+ x
}
}
diff --git a/sources/scala/concurrent/LinkedList.scala b/sources/scala/concurrent/LinkedList.scala
deleted file mode 100644
index 7e9358b36d..0000000000
--- a/sources/scala/concurrent/LinkedList.scala
+++ /dev/null
@@ -1,12 +0,0 @@
-package scala.concurrent;
-class LinkedList[a] {
- var elem: a = _;
- var next: LinkedList[a] = null;
- def insert(elem: a): LinkedList[a] = {
- val nx = new LinkedList[a];
- nx.elem = elem;
- nx.next = next;
- next = nx;
- next
- }
-}
diff --git a/test/files/pos/MailBox.scala b/test/files/pos/MailBox.scala
index c44da9fdfa..e081735911 100644
--- a/test/files/pos/MailBox.scala
+++ b/test/files/pos/MailBox.scala
@@ -3,6 +3,18 @@ package test;
import scala.concurrent._;
class MailBox with Monitor {
+ private class LinkedList[a] {
+ var elem: a = _;
+ var next: LinkedList[a] = null;
+ }
+
+ def insert(l: LinkedList[a], x: a): LinkedList[a] {
+ l.next = new LinkedList[a];
+ l.next.elem = x;
+ l.next.next = l.next;
+ l
+ }
+
private abstract class Receiver {
def isDefined(msg: Any): boolean;
var msg: Any = null;
@@ -21,7 +33,7 @@ class MailBox with Monitor {
if (r1 != null) {
r.next = r1.next; r1.elem.msg = msg; r1.elem.notify;
} else {
- lastSent = lastSent.insert(msg);
+ lastSent = insert(lastSent, msg);
}
}
@@ -34,7 +46,7 @@ class MailBox with Monitor {
if (s1 != null) {
s.next = s1.next; s1.elem
} else {
- val r = lastReceiver.insert(new Receiver {
+ val r = insert(lastReceiver, new Receiver {
def isDefined(msg: Any) = f.isDefinedAt(msg);
});
lastReceiver = r;
@@ -54,7 +66,7 @@ class MailBox with Monitor {
if (s1 != null) {
s.next = s1.next; s1.elem
} else {
- val r = lastReceiver.insert(new Receiver {
+ val r = insert(lastReceiver, new Receiver {
def isDefined(msg: Any) = f.isDefinedAt(msg);
});
lastReceiver = r;
diff --git a/test/pos/MailBox.scala b/test/pos/MailBox.scala
index c44da9fdfa..e081735911 100644
--- a/test/pos/MailBox.scala
+++ b/test/pos/MailBox.scala
@@ -3,6 +3,18 @@ package test;
import scala.concurrent._;
class MailBox with Monitor {
+ private class LinkedList[a] {
+ var elem: a = _;
+ var next: LinkedList[a] = null;
+ }
+
+ def insert(l: LinkedList[a], x: a): LinkedList[a] {
+ l.next = new LinkedList[a];
+ l.next.elem = x;
+ l.next.next = l.next;
+ l
+ }
+
private abstract class Receiver {
def isDefined(msg: Any): boolean;
var msg: Any = null;
@@ -21,7 +33,7 @@ class MailBox with Monitor {
if (r1 != null) {
r.next = r1.next; r1.elem.msg = msg; r1.elem.notify;
} else {
- lastSent = lastSent.insert(msg);
+ lastSent = insert(lastSent, msg);
}
}
@@ -34,7 +46,7 @@ class MailBox with Monitor {
if (s1 != null) {
s.next = s1.next; s1.elem
} else {
- val r = lastReceiver.insert(new Receiver {
+ val r = insert(lastReceiver, new Receiver {
def isDefined(msg: Any) = f.isDefinedAt(msg);
});
lastReceiver = r;
@@ -54,7 +66,7 @@ class MailBox with Monitor {
if (s1 != null) {
s.next = s1.next; s1.elem
} else {
- val r = lastReceiver.insert(new Receiver {
+ val r = insert(lastReceiver, new Receiver {
def isDefined(msg: Any) = f.isDefinedAt(msg);
});
lastReceiver = r;