summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2009-10-26 21:01:12 +0000
committerPhilipp Haller <hallerp@gmail.com>2009-10-26 21:01:12 +0000
commitf3068614fb38fc08be54ac1179a1cfec52b8b13b (patch)
tree76ee219f209559d900b17682e29c9aaf9b3d73ab
parent63b1fd9be6c8c9e28092d775037c695af4b264e3 (diff)
downloadscala-f3068614fb38fc08be54ac1179a1cfec52b8b13b.tar.gz
scala-f3068614fb38fc08be54ac1179a1cfec52b8b13b.tar.bz2
scala-f3068614fb38fc08be54ac1179a1cfec52b8b13b.zip
Second half of fix and tests for #1518.
-rw-r--r--docs/examples/actors/fringe.scala9
-rw-r--r--docs/examples/actors/message.scala12
-rw-r--r--src/actors/scala/actors/Actor.scala20
-rw-r--r--test/files/jvm/actor-receive-sender.check2
-rw-r--r--test/files/jvm/actor-receive-sender.scala51
-rw-r--r--test/files/jvm/replyreactor-react-sender.check1
-rw-r--r--test/files/jvm/replyreactor-react-sender.scala41
-rw-r--r--test/files/neg/plugin-after-terminal/lib/plugins.jar.desired.sha12
-rw-r--r--test/files/neg/plugin-before-parser/lib/plugins.jar.desired.sha12
-rw-r--r--test/files/neg/plugin-cyclic-dependency/lib/plugins.jar.desired.sha12
-rw-r--r--test/files/neg/plugin-multiple-rafter/lib/plugins.jar.desired.sha12
-rw-r--r--test/files/neg/plugin-rafter-before-1/lib/plugins.jar.desired.sha12
-rw-r--r--test/files/neg/plugin-rightafter-terminal/lib/plugins.jar.desired.sha12
13 files changed, 136 insertions, 12 deletions
diff --git a/docs/examples/actors/fringe.scala b/docs/examples/actors/fringe.scala
index 2026628cb3..2afdc41b4f 100644
--- a/docs/examples/actors/fringe.scala
+++ b/docs/examples/actors/fringe.scala
@@ -2,6 +2,8 @@ package examples.actors
import scala.actors.Actor._
import scala.actors.{Channel, OutputChannel}
+import scala.actors.{Debug, Scheduler}
+import scala.actors.scheduler.ResizableThreadPoolScheduler
/**
@author Philipp Haller
@@ -18,6 +20,13 @@ object fringe extends Application {
case class Equal(atom1: Option[Leaf], atom2: Option[Leaf])
case class Extract(tree: Tree)
+ Debug.level = 3
+ Scheduler.impl = {
+ val s = new ResizableThreadPoolScheduler(false)
+ s.start()
+ s
+ }
+
val comparator = actor {
val extractor1 = actor(extractorBehavior())
val extractor2 = actor(extractorBehavior())
diff --git a/docs/examples/actors/message.scala b/docs/examples/actors/message.scala
index d385543470..eb29468160 100644
--- a/docs/examples/actors/message.scala
+++ b/docs/examples/actors/message.scala
@@ -3,6 +3,8 @@ package examples.actors
import scala.actors.{Actor, Scheduler}
import scala.actors.Actor._
import scala.actors.scheduler.SingleThreadedScheduler
+import scala.actors.{Debug, Scheduler}
+import scala.actors.scheduler.ResizableThreadPoolScheduler
object message {
def main(args: Array[String]) {
@@ -14,7 +16,13 @@ object message {
}
val nActors = 500
val finalSum = n * nActors
- Scheduler.impl = new SingleThreadedScheduler
+ //Scheduler.impl = new SingleThreadedScheduler
+ Debug.level = 3
+ Scheduler.impl = {
+ val s = new ResizableThreadPoolScheduler(false)
+ s.start()
+ s
+ }
def beh(next: Actor, sum: Int) {
react {
@@ -35,6 +43,6 @@ object message {
val firstActor = actorChain(nActors, null)
var i = n; while (i > 0) { firstActor ! 0; i -= 1 }
- Scheduler.shutdown()
+ //Scheduler.shutdown()
}
}
diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala
index 553019932d..b563104f41 100644
--- a/src/actors/scala/actors/Actor.scala
+++ b/src/actors/scala/actors/Actor.scala
@@ -10,7 +10,6 @@
package scala.actors
-import scala.compat.Platform
import scala.util.control.ControlException
import java.util.{Timer, TimerTask}
import java.util.concurrent.{ExecutionException, Callable}
@@ -439,7 +438,12 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor {
var done = false
while (!done) {
- val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => f.isDefinedAt(m))
+ val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => {
+ senders = replyTo :: senders
+ val matches = f.isDefinedAt(m)
+ senders = senders.tail
+ matches
+ })
if (null eq qel) {
synchronized {
// in mean time new stuff might have arrived
@@ -496,7 +500,12 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor {
var done = false
while (!done) {
- val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => f.isDefinedAt(m))
+ val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => {
+ senders = replyTo :: senders
+ val matches = f.isDefinedAt(m)
+ senders = senders.tail
+ matches
+ })
if (null eq qel) {
val todo = synchronized {
// in mean time new stuff might have arrived
@@ -592,7 +601,10 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor {
var done = false
while (!done) {
- val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => f.isDefinedAt(m))
+ val qel = mailbox.extractFirst((m: Any, replyTo: OutputChannel[Any]) => {
+ senders = List(replyTo)
+ f.isDefinedAt(m)
+ })
if (null eq qel) {
val todo = synchronized {
// in mean time new stuff might have arrived
diff --git a/test/files/jvm/actor-receive-sender.check b/test/files/jvm/actor-receive-sender.check
new file mode 100644
index 0000000000..2c94e48371
--- /dev/null
+++ b/test/files/jvm/actor-receive-sender.check
@@ -0,0 +1,2 @@
+OK
+OK
diff --git a/test/files/jvm/actor-receive-sender.scala b/test/files/jvm/actor-receive-sender.scala
new file mode 100644
index 0000000000..ea7c40cced
--- /dev/null
+++ b/test/files/jvm/actor-receive-sender.scala
@@ -0,0 +1,51 @@
+import scala.actors.{Actor, TIMEOUT, Exit}
+import scala.actors.Actor._
+
+object Test {
+
+ val NUM = 2000
+
+ def main(args: Array[String]) {
+ var b: Actor = null
+ var c: Actor = null
+
+ val a = actor {
+ for (_ <- 0 until NUM)
+ receive {
+ case 'hello if sender == b => // do nothing
+ }
+ b ! 'ok
+ for (_ <- 0 until NUM)
+ receiveWithin (1000) {
+ case 'bye if sender == b => // do nothing
+ case TIMEOUT => b ! 'fail
+ }
+ b ! 'ok
+ }
+
+ b = actor {
+ self.trapExit = true
+ link(a)
+
+ for (_ <- 0 until NUM)
+ a ! 'hello
+
+ val proceed = receive {
+ case Exit(from, reason) => println("FAIL"); false
+ case 'ok => println("OK"); true
+ case other => println(other); false
+ }
+
+ if (proceed) {
+ for (_ <- 0 until NUM)
+ a ! 'bye
+ receive {
+ case Exit(from, reason) => println("FAIL")
+ case 'ok => println("OK")
+ case other => println(other)
+ }
+ }
+ }
+ }
+
+}
diff --git a/test/files/jvm/replyreactor-react-sender.check b/test/files/jvm/replyreactor-react-sender.check
new file mode 100644
index 0000000000..d86bac9de5
--- /dev/null
+++ b/test/files/jvm/replyreactor-react-sender.check
@@ -0,0 +1 @@
+OK
diff --git a/test/files/jvm/replyreactor-react-sender.scala b/test/files/jvm/replyreactor-react-sender.scala
new file mode 100644
index 0000000000..1127dfd0a5
--- /dev/null
+++ b/test/files/jvm/replyreactor-react-sender.scala
@@ -0,0 +1,41 @@
+import scala.actors.ReplyReactor
+import scala.actors.Actor._
+
+object Test {
+
+ val NUM = 2000
+
+ def main(args: Array[String]) {
+ var b: ReplyReactor = null
+
+ val a = new ReplyReactor {
+ def act() {
+ var i = 0
+ loopWhile (i < NUM) {
+ i += 1
+ react {
+ case 'hello if sender == this => b ! 'fail
+ case 'hello if sender == b => // do nothing
+ }
+ } andThen {
+ b ! 'ok
+ }
+ }
+ }
+ a.start()
+
+ b = new ReplyReactor {
+ def act() {
+ for (_ <- 0 until NUM)
+ a ! 'hello
+ react {
+ case 'fail => println("FAIL")
+ case 'ok => println("OK")
+ case other => println(other)
+ }
+ }
+ }
+ b.start()
+ }
+
+}
diff --git a/test/files/neg/plugin-after-terminal/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-after-terminal/lib/plugins.jar.desired.sha1
index 23c54fb2de..30eca6b315 100644
--- a/test/files/neg/plugin-after-terminal/lib/plugins.jar.desired.sha1
+++ b/test/files/neg/plugin-after-terminal/lib/plugins.jar.desired.sha1
@@ -1 +1 @@
-cf80703ed94f5176dc099c60b32d0483322de9eb ?plugins.jar
+eeefa01bb3bc224f75a2ee3d82a82054f4532b5f ?plugins.jar
diff --git a/test/files/neg/plugin-before-parser/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-before-parser/lib/plugins.jar.desired.sha1
index 27c022e853..2aab42459e 100644
--- a/test/files/neg/plugin-before-parser/lib/plugins.jar.desired.sha1
+++ b/test/files/neg/plugin-before-parser/lib/plugins.jar.desired.sha1
@@ -1 +1 @@
-2e05e73ed90aaf286fa6555d992c1da18de3ceca ?plugins.jar
+755fb75a6c635ca586f79e05c2785d55e52021cf ?plugins.jar
diff --git a/test/files/neg/plugin-cyclic-dependency/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-cyclic-dependency/lib/plugins.jar.desired.sha1
index f1fb45387c..61479de33d 100644
--- a/test/files/neg/plugin-cyclic-dependency/lib/plugins.jar.desired.sha1
+++ b/test/files/neg/plugin-cyclic-dependency/lib/plugins.jar.desired.sha1
@@ -1 +1 @@
-d96a5f1b3885225a5e203ae59ae2f2f3e3c65c9b ?plugins.jar
+217093efbc909edc21564a42c7069a9561921872 ?plugins.jar
diff --git a/test/files/neg/plugin-multiple-rafter/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-multiple-rafter/lib/plugins.jar.desired.sha1
index 9706b6dd60..761063a205 100644
--- a/test/files/neg/plugin-multiple-rafter/lib/plugins.jar.desired.sha1
+++ b/test/files/neg/plugin-multiple-rafter/lib/plugins.jar.desired.sha1
@@ -1 +1 @@
-ee728763d50a19e725f729797d5afab05d395c4e ?plugins.jar
+3be489ca675f18a64e0af8f5c7efcbe0f7cae2ab ?plugins.jar
diff --git a/test/files/neg/plugin-rafter-before-1/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-rafter-before-1/lib/plugins.jar.desired.sha1
index b07cece8b9..f6df99f615 100644
--- a/test/files/neg/plugin-rafter-before-1/lib/plugins.jar.desired.sha1
+++ b/test/files/neg/plugin-rafter-before-1/lib/plugins.jar.desired.sha1
@@ -1 +1 @@
-398fa866d1d5c6608c9607dd1079afc12182119f ?plugins.jar
+aa034e5f24a9cc5c3d73e3fe79000c80e0028b81 ?plugins.jar
diff --git a/test/files/neg/plugin-rightafter-terminal/lib/plugins.jar.desired.sha1 b/test/files/neg/plugin-rightafter-terminal/lib/plugins.jar.desired.sha1
index 78a4fc0c98..2d4f41ffdd 100644
--- a/test/files/neg/plugin-rightafter-terminal/lib/plugins.jar.desired.sha1
+++ b/test/files/neg/plugin-rightafter-terminal/lib/plugins.jar.desired.sha1
@@ -1 +1 @@
-b2166b6bc2a55264d959e613fa52695295db2281 ?plugins.jar
+6c9a6c7c3c5b86ece1d56476f7d6a35b6d7d7a03 ?plugins.jar