From 14bb605d959f88978ad3ef374295afe5f4fff169 Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Mon, 15 Dec 2008 11:05:52 +0000 Subject: Avoid collecting race in memory leak fix --- src/actors/scala/actors/ActorGC.scala | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'src/actors') 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 } -- cgit v1.2.3