From fa70f512342aab6767c8a8fa59ec39b98d8640e2 Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Wed, 22 Jul 2009 17:08:35 +0000 Subject: Proposed fix to address #2165. --- src/library/scala/ref/PhantomReference.scala | 1 + src/library/scala/ref/ReferenceQueue.scala | 20 ++++++++++++++++---- src/library/scala/ref/ReferenceWrapper.scala | 4 ++-- src/library/scala/ref/SoftReference.scala | 1 + src/library/scala/ref/WeakReference.scala | 1 + 5 files changed, 21 insertions(+), 6 deletions(-) (limited to 'src/library') 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) } -- cgit v1.2.3