diff options
author | Philipp Haller <hallerp@gmail.com> | 2008-12-15 11:05:52 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2008-12-15 11:05:52 +0000 |
commit | 14bb605d959f88978ad3ef374295afe5f4fff169 (patch) | |
tree | 9db2fd372969f79621f91de8260824ef95179769 | |
parent | 8836f6c0f0ad4b39972d9a8979aaf2b705d24c69 (diff) | |
download | scala-14bb605d959f88978ad3ef374295afe5f4fff169.tar.gz scala-14bb605d959f88978ad3ef374295afe5f4fff169.tar.bz2 scala-14bb605d959f88978ad3ef374295afe5f4fff169.zip |
Avoid collecting race in memory leak fix
-rw-r--r-- | src/actors/scala/actors/ActorGC.scala | 13 |
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 } |