summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2009-05-24 14:15:40 +0000
committerPhilipp Haller <hallerp@gmail.com>2009-05-24 14:15:40 +0000
commita1f098795934a4ccc8a3e72b779e47b911eae0f4 (patch)
treed077b5e5a7f8f221b86e61c024dc564da517f37c /test
parent54a706f3f652778a3119926105bcd01920a4680f (diff)
downloadscala-a1f098795934a4ccc8a3e72b779e47b911eae0f4.tar.gz
scala-a1f098795934a4ccc8a3e72b779e47b911eae0f4.tar.bz2
scala-a1f098795934a4ccc8a3e72b779e47b911eae0f4.zip
Fixed #1999.
Diffstat (limited to 'test')
-rw-r--r--test/files/jvm/actorgc_leak.check1
-rw-r--r--test/files/jvm/actorgc_leak.scala63
2 files changed, 64 insertions, 0 deletions
diff --git a/test/files/jvm/actorgc_leak.check b/test/files/jvm/actorgc_leak.check
new file mode 100644
index 0000000000..a965a70ed4
--- /dev/null
+++ b/test/files/jvm/actorgc_leak.check
@@ -0,0 +1 @@
+Done
diff --git a/test/files/jvm/actorgc_leak.scala b/test/files/jvm/actorgc_leak.scala
new file mode 100644
index 0000000000..5e2b9d51e1
--- /dev/null
+++ b/test/files/jvm/actorgc_leak.scala
@@ -0,0 +1,63 @@
+
+import scala.actors.Actor
+
+object Test {
+ class FatActorFactory extends Actor {
+ def act() {
+ var cnt = 0
+ Actor.loopWhile(cnt < fatActors) {
+ //if ((cnt % 5) == 0) println(cnt)
+ val fa = new FatActor()
+ fa.start()
+ cnt += 1
+ if (cnt == fatActors) Monitor ! 'done
+ }
+ }
+ }
+
+ class FatActor extends Actor {
+ def act() {
+ fat = new Array[Int](fatness)
+ react {
+ case 'hi => exit()
+ }
+ }
+ private var fat: Array[Int] = _
+ }
+
+ object Monitor extends Actor {
+ private var cnt = 0
+ def act() {
+ Actor.loop {
+ react {
+ case 'done => {
+ cnt += 1
+ if (cnt == factories) System.exit(0) // once GC pressure stops FatActors stop being collected, and as
+ } // a result ActorGC never finds out that they are defunct
+ }
+ }
+ }
+ }
+
+ val factories = 4 // the number of factories to start
+ val fatActors = 50 // the number of FatActors for each factory to produce
+ val fatness = 1024*1024*10
+
+ def main(args: Array[String]) {
+ scala.actors.Scheduler.impl.shutdown()
+ val sched = {
+ val s = new scala.actors.FJTaskScheduler2
+ s.start()
+ s
+ }
+ scala.actors.Scheduler.impl = sched
+
+ Monitor.start()
+ for(i <- 1 to factories) {
+ //if ((i % 50) == 0) println(i)
+ val fa = new FatActorFactory()
+ fa.start()
+ }
+ println("Done")
+ }
+}