summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2009-10-25 08:31:33 +0000
committerPhilipp Haller <hallerp@gmail.com>2009-10-25 08:31:33 +0000
commita129d09baec62024b1c040ddd52405d05fea3933 (patch)
tree67ce3307f7494df68ebf430d08185404d46f572a
parent728775440ccd67928c25914a1e003ff9765ad80b (diff)
downloadscala-a129d09baec62024b1c040ddd52405d05fea3933.tar.gz
scala-a129d09baec62024b1c040ddd52405d05fea3933.tar.bz2
scala-a129d09baec62024b1c040ddd52405d05fea3933.zip
Fix and test for #2515.
-rw-r--r--src/actors/scala/actors/Future.scala9
-rw-r--r--test/files/jvm/t2515.check10
-rw-r--r--test/files/jvm/t2515.scala40
3 files changed, 57 insertions, 2 deletions
diff --git a/src/actors/scala/actors/Future.scala b/src/actors/scala/actors/Future.scala
index ec07f2a1a8..e26b0b02df 100644
--- a/src/actors/scala/actors/Future.scala
+++ b/src/actors/scala/actors/Future.scala
@@ -79,9 +79,10 @@ object Futures {
*/
def awaitAll(timeout: Long, fts: Future[Any]*): List[Option[Any]] = {
val thisActor = Actor.self
- Actor.timer.schedule(new java.util.TimerTask {
+ val timerTask = new java.util.TimerTask {
def run() { thisActor ! TIMEOUT }
- }, timeout)
+ }
+ Actor.timer.schedule(timerTask, timeout)
var resultsMap: collection.mutable.Map[Int, Option[Any]] = new collection.mutable.HashMap[Int, Option[Any]]
@@ -133,6 +134,10 @@ object Futures {
for (i <- 0 until size) {
results = resultsMap(size - i - 1) :: results
}
+
+ // cancel scheduled timer task
+ timerTask.cancel()
+
results
}
diff --git a/test/files/jvm/t2515.check b/test/files/jvm/t2515.check
new file mode 100644
index 0000000000..8cb8bde11e
--- /dev/null
+++ b/test/files/jvm/t2515.check
@@ -0,0 +1,10 @@
+Iteration 1 succeeded
+Iteration 2 succeeded
+Iteration 3 succeeded
+Iteration 4 succeeded
+Iteration 5 succeeded
+Iteration 6 succeeded
+Iteration 7 succeeded
+Iteration 8 succeeded
+Iteration 9 succeeded
+Iteration 10 succeeded
diff --git a/test/files/jvm/t2515.scala b/test/files/jvm/t2515.scala
new file mode 100644
index 0000000000..83cb058168
--- /dev/null
+++ b/test/files/jvm/t2515.scala
@@ -0,0 +1,40 @@
+import scala.actors.{Futures, TIMEOUT}
+import scala.actors.Actor._
+
+object Test {
+
+ def compute(): Option[Boolean] = {
+ val fts = for (j <- 0 until 5) yield Futures.future {
+ receiveWithin (100) {
+ case TIMEOUT => true
+ case other => false
+ }
+ }
+ val done = Futures.awaitAll(2000, fts.toArray: _*) // list to array, as varargs
+ if (done.contains(None))
+ None
+ else
+ Some(true)
+ }
+
+ def main(args:Array[String]) : Unit = {
+ val format = new java.text.DecimalFormat("000.00'ms'")
+ var iter = 1
+ val done = 11
+ while (iter < done) {
+ val start = System.nanoTime()
+ val result = compute()
+ val time = System.nanoTime() - start
+ result match {
+ case Some(result) =>
+ //printf("Iteration %2d succeeded after %s %n", iter, format.format(time / 1e6))
+ printf("Iteration %2d succeeded%n", iter)
+ iter += 1
+ case None =>
+ printf(">>>> Iteration %2d failed after %s <<<<< %n", iter, format.format(time / 1e6))
+ iter = done
+ }
+ }
+ }
+
+}