summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2009-07-22 17:08:35 +0000
committerPhilipp Haller <hallerp@gmail.com>2009-07-22 17:08:35 +0000
commitfa70f512342aab6767c8a8fa59ec39b98d8640e2 (patch)
tree81a3b69990c2af3ce562e3c513ec78bedddf349d /src/library
parent3b0c2ba269388686ee6b3d797aa5d8cc7c5547db (diff)
downloadscala-fa70f512342aab6767c8a8fa59ec39b98d8640e2.tar.gz
scala-fa70f512342aab6767c8a8fa59ec39b98d8640e2.tar.bz2
scala-fa70f512342aab6767c8a8fa59ec39b98d8640e2.zip
Proposed fix to address #2165.
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/ref/PhantomReference.scala1
-rw-r--r--src/library/scala/ref/ReferenceQueue.scala20
-rw-r--r--src/library/scala/ref/ReferenceWrapper.scala4
-rw-r--r--src/library/scala/ref/SoftReference.scala1
-rw-r--r--src/library/scala/ref/WeakReference.scala1
5 files changed, 21 insertions, 6 deletions
diff --git a/src/library/scala/ref/PhantomReference.scala b/src/library/scala/ref/PhantomReference.scala
index fee8e2298a..d070f8f28e 100644
--- a/src/library/scala/ref/PhantomReference.scala
+++ b/src/library/scala/ref/PhantomReference.scala
@@ -16,5 +16,6 @@ package scala.ref
class PhantomReference[+T <: AnyRef](value: T, queue: ReferenceQueue[T]) extends ReferenceWrapper[T] {
val underlying: java.lang.ref.PhantomReference[_ <: T] =
new java.lang.ref.PhantomReference[T](value, queue.underlying.asInstanceOf[java.lang.ref.ReferenceQueue[T]])
+ queue.register(this)
}
diff --git a/src/library/scala/ref/ReferenceQueue.scala b/src/library/scala/ref/ReferenceQueue.scala
index f55c95830e..c393e9aa09 100644
--- a/src/library/scala/ref/ReferenceQueue.scala
+++ b/src/library/scala/ref/ReferenceQueue.scala
@@ -10,18 +10,30 @@
package scala.ref
+import scala.collection.mutable.HashMap
+
/**
- * @author Sean McDirmid
+ * @author Sean McDirmid, Philipp Haller
*/
class ReferenceQueue[+T <: AnyRef] {
private[ref] val underlying: java.lang.ref.ReferenceQueue[_ <: T] = new java.lang.ref.ReferenceQueue[T]
override def toString = underlying.toString
- protected class Wrapper[U <: AnyRef](val underlying: java.lang.ref.Reference[U]) extends ReferenceWrapper[U]
- protected def Wrapper[U <: AnyRef](ref: java.lang.ref.Reference[U]) = ref match {
+
+ protected def Wrapper(jref: java.lang.ref.Reference[_]) = jref match {
case null => None
- case ref => Some(new Wrapper(ref))
+ case ref =>
+ val refWrapper = wrappers(ref)
+ wrappers -= ref
+ Some(refWrapper.asInstanceOf[Reference[T]])
}
+
def poll: Option[Reference[T]] = Wrapper(underlying.poll)
def remove: Option[Reference[T]] = Wrapper(underlying.remove)
def remove(timeout: Long): Option[Reference[T]] = Wrapper(underlying.remove(timeout))
+
+ protected val wrappers = new HashMap[java.lang.ref.Reference[_],
+ ReferenceWrapper[_ <: AnyRef]]
+ def register(ref: ReferenceWrapper[_ <: AnyRef]) {
+ wrappers += ((ref.underlying, ref))
+ }
}
diff --git a/src/library/scala/ref/ReferenceWrapper.scala b/src/library/scala/ref/ReferenceWrapper.scala
index afafd97453..e10eebd82f 100644
--- a/src/library/scala/ref/ReferenceWrapper.scala
+++ b/src/library/scala/ref/ReferenceWrapper.scala
@@ -17,11 +17,11 @@ trait ReferenceWrapper[+T <: AnyRef] extends Reference[T] with Proxy {
val underlying: java.lang.ref.Reference[_ <: T]
@deprecated def isValid = underlying.get != null
override def get = {
- val ret = underlying.get.asInstanceOf[T]
+ val ret = underlying.get
if (ret eq null) None else Some(ret)
}
def apply() = {
- val ret = underlying.get.asInstanceOf[T]
+ val ret = underlying.get
if (ret eq null) throw new NoSuchElementException
ret
}
diff --git a/src/library/scala/ref/SoftReference.scala b/src/library/scala/ref/SoftReference.scala
index 0768b2af65..c4c9aa4d03 100644
--- a/src/library/scala/ref/SoftReference.scala
+++ b/src/library/scala/ref/SoftReference.scala
@@ -18,4 +18,5 @@ class SoftReference[+T <: AnyRef](value : T, queue : ReferenceQueue[T]) extends
val underlying: java.lang.ref.SoftReference[_ <: T] =
if (queue == null) new java.lang.ref.SoftReference[T](value);
else new java.lang.ref.SoftReference[T](value, queue.underlying.asInstanceOf[java.lang.ref.ReferenceQueue[T]])
+ queue.register(this)
}
diff --git a/src/library/scala/ref/WeakReference.scala b/src/library/scala/ref/WeakReference.scala
index ad04e4d531..a980183fed 100644
--- a/src/library/scala/ref/WeakReference.scala
+++ b/src/library/scala/ref/WeakReference.scala
@@ -18,4 +18,5 @@ class WeakReference[+T <: AnyRef](value: T, queue: ReferenceQueue[T]) extends Re
val underlying: java.lang.ref.WeakReference[_ <: T] =
if (queue == null) new java.lang.ref.WeakReference[T](value)
else new java.lang.ref.WeakReference[T](value, queue.underlying.asInstanceOf[java.lang.ref.ReferenceQueue[T]])
+ queue.register(this)
}