summaryrefslogtreecommitdiff
path: root/src/actors
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2008-12-15 11:05:52 +0000
committerPhilipp Haller <hallerp@gmail.com>2008-12-15 11:05:52 +0000
commit14bb605d959f88978ad3ef374295afe5f4fff169 (patch)
tree9db2fd372969f79621f91de8260824ef95179769 /src/actors
parent8836f6c0f0ad4b39972d9a8979aaf2b705d24c69 (diff)
downloadscala-14bb605d959f88978ad3ef374295afe5f4fff169.tar.gz
scala-14bb605d959f88978ad3ef374295afe5f4fff169.tar.bz2
scala-14bb605d959f88978ad3ef374295afe5f4fff169.zip
Avoid collecting race in memory leak fix
Diffstat (limited to 'src/actors')
-rw-r--r--src/actors/scala/actors/ActorGC.scala13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/actors/scala/actors/ActorGC.scala b/src/actors/scala/actors/ActorGC.scala
index d644dd51a7..dd6780281b 100644
--- a/src/actors/scala/actors/ActorGC.scala
+++ b/src/actors/scala/actors/ActorGC.scala
@@ -10,10 +10,10 @@
package scala.actors
-import java.lang.ref.{WeakReference, ReferenceQueue}
+import java.lang.ref.{Reference, WeakReference, ReferenceQueue}
import java.util.WeakHashMap
-import scala.collection.mutable.HashMap
+import scala.collection.mutable.{HashMap, HashSet}
object ActorGC {
@@ -21,11 +21,11 @@ object ActorGC {
private val termHandlers = new HashMap[Actor, () => Unit]
private val refQ = new ReferenceQueue[Actor]
- private val refMap = new WeakHashMap[WeakReference[Actor], AnyRef]
+ private val refSet = new HashSet[Reference[t] forSome { type t <: Actor }]
def newActor(a: Actor) = synchronized {
val wr = new WeakReference[Actor](a, refQ)
- refMap.put(wr, null)
+ refSet += wr
pendingReactions += 1
}
@@ -35,6 +35,7 @@ object ActorGC {
val wr = refQ.poll
if (wr != null) {
pendingReactions -= 1
+ refSet -= wr
// continue draining
drainRefQ()
}
@@ -42,6 +43,10 @@ object ActorGC {
drainRefQ()
}
+ def status() {
+ println("ActorGC: size of refSet: "+refSet.size)
+ }
+
def allTerminated: Boolean = synchronized {
pendingReactions <= 0
}