summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/SymbolTable.scala
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-01-12 13:24:13 -0800
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2014-01-12 13:24:13 -0800
commit40df7c7b337dc475e5aa3df23c992b648dd37ef6 (patch)
tree794a7c50af0655569f47544e0b6334ef356f283b /src/reflect/scala/reflect/internal/SymbolTable.scala
parentc0ff1700e060b23eddd75712686d93255c8be1ca (diff)
parent00e11ffdd45a7be544b1566bf21cd4396381750e (diff)
downloadscala-40df7c7b337dc475e5aa3df23c992b648dd37ef6.tar.gz
scala-40df7c7b337dc475e5aa3df23c992b648dd37ef6.tar.bz2
scala-40df7c7b337dc475e5aa3df23c992b648dd37ef6.zip
Merge pull request #3346 from retronym/ticket/8129
SI-8129 Plug a leak in perRunCaches
Diffstat (limited to 'src/reflect/scala/reflect/internal/SymbolTable.scala')
-rw-r--r--src/reflect/scala/reflect/internal/SymbolTable.scala12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/reflect/scala/reflect/internal/SymbolTable.scala b/src/reflect/scala/reflect/internal/SymbolTable.scala
index c46a559d6d..bed8310767 100644
--- a/src/reflect/scala/reflect/internal/SymbolTable.scala
+++ b/src/reflect/scala/reflect/internal/SymbolTable.scala
@@ -356,16 +356,18 @@ abstract class SymbolTable extends macros.Universe
// Weak references so the garbage collector will take care of
// letting us know when a cache is really out of commission.
- private val caches = WeakHashSet[Clearable]()
+ import java.lang.ref.WeakReference
+ private var caches = List[WeakReference[Clearable]]()
def recordCache[T <: Clearable](cache: T): T = {
- caches += cache
+ caches ::= new WeakReference(cache)
cache
}
def clearAll() = {
debuglog("Clearing " + caches.size + " caches.")
- caches foreach (_.clear)
+ caches foreach (ref => Option(ref.get).foreach(_.clear))
+ caches = caches.filterNot(_.get == null)
}
def newWeakMap[K, V]() = recordCache(mutable.WeakHashMap[K, V]())
@@ -376,9 +378,9 @@ abstract class SymbolTable extends macros.Universe
val NoCached: T = null.asInstanceOf[T]
var cached: T = NoCached
var cachedRunId = NoRunId
- caches += new Clearable {
+ recordCache(new Clearable {
def clear(): Unit = cached = NoCached
- }
+ })
() => {
if (currentRunId != cachedRunId || cached == NoCached) {
cached = f