JDK 9 RFR of 8032397: Remove sun.misc.Ref
Joe Darcy
joe.darcy at oracle.com
Tue Jan 21 21:44:23 UTC 2014
PS Webrev now posted at:
http://cr.openjdk.java.net/~darcy/8032397.0/
-Joe
On 01/21/2014 10:28 AM, Joe Darcy wrote:
> Hello,
>
> Following up from an earlier discussion on core-libs [1], I've gone
> through the exercise of purging sun.misc.Ref from the JDK repo. Patch
> below (having difficulties uploading the webrev to cr.openjdk at the
> time of writing.)
>
> For the change associated with removing sun.misc.Ref, I was aiming to
> minimize the alteration of surrounding code.
>
> For sun.misc.Cache, the CacheEntry class that subclasses Ref before
> now instead has an internal SoftReference and a few short methods that
> Ref used to define.
>
> In the Applet area, since the functionality of sun.misc.Ref over and
> above SoftReference was being used, I copied and partially generified
> the sun.misc.Ref code into AppletImageRef. Semantically,
> AppletImageRef is now a sun.misc.Ref<Image>.
>
> The purge of Ref required removing a method from AppletResourceLoader,
> a class which looks like it should have long ago been deprecated.
>
> A clean build of the jdk repo works after sun.misc.Ref has been
> deleted. Before pushing the change, I'll do a jprt job to make sure
> there aren't any other stray uses of Ref.
>
> Thanks,
>
> -Joe
>
> [1]
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2014-January/024249.html
>
> diff -r 9bf43f25eacd src/share/classes/sun/applet/AppletImageRef.java
> --- a/src/share/classes/sun/applet/AppletImageRef.java Sat Jan 18
> 10:57:41 2014 -0800
> +++ b/src/share/classes/sun/applet/AppletImageRef.java Tue Jan 21
> 10:15:15 2014 -0800
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 1996, Oracle and/or its affiliates. All rights
> reserved.
> + * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights
> reserved.
> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> *
> * This code is free software; you can redistribute it and/or modify it
> @@ -27,27 +27,71 @@
>
> import java.awt.Toolkit;
> import java.awt.Image;
> +import java.lang.ref.SoftReference;
> import sun.awt.image.URLImageSource;
> import java.net.URL;
>
> -class AppletImageRef extends sun.misc.Ref {
> +class AppletImageRef {
> + private SoftReference<Image> soft = null;
> +
> URL url;
>
> /**
> + * Returns a pointer to the object referenced by this Ref. If the
> object
> + * has been thrown away by the garbage collector, it will be
> + * reconstituted. This method does everything necessary to ensure
> that the garbage
> + * collector throws things away in Least Recently Used(LRU)
> order. Applications should
> + * never override this method. The get() method effectively
> caches calls to
> + * reconstitute().
> + */
> + public synchronized Image get() {
> + Image t = check();
> + if (t == null) {
> + t = reconstitute();
> + setThing(t);
> + }
> + return t;
> + }
> +
> + /**
> * Create the Ref
> */
> AppletImageRef(URL url) {
> this.url = url;
> }
>
> - public void flush() {
> - super.flush();
> + /**
> + * Flushes the cached object. Forces the next invocation of
> get() to
> + * invoke reconstitute().
> + */
> + public synchronized void flush() {
> + SoftReference s = soft;
> + if (s != null) s.clear();
> + soft = null;
> + }
> +
> + /**
> + * Sets the thing to the specified object.
> + * @param thing the specified object
> + */
> + public synchronized void setThing(Object thing) {
> + flush();
> + soft = new SoftReference(thing);
> + }
> +
> + /**
> + * Checks to see what object is being pointed at by this Ref and
> returns it.
> + */
> + public synchronized Image check() {
> + SoftReference<Image> s = soft;
> + if (s == null) return null;
> + return s.get();
> }
>
> /**
> * Reconsitute the image. Only called when the ref has been
> flushed.
> */
> - public Object reconstitute() {
> + public Image reconstitute() {
> Image img = Toolkit.getDefaultToolkit().createImage(new
> URLImageSource(url));
> return img;
> }
> diff -r 9bf43f25eacd
> src/share/classes/sun/applet/AppletResourceLoader.java
> --- a/src/share/classes/sun/applet/AppletResourceLoader.java Sat Jan
> 18 10:57:41 2014 -0800
> +++ b/src/share/classes/sun/applet/AppletResourceLoader.java Tue Jan
> 21 10:15:15 2014 -0800
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 1996, 1998, Oracle and/or its affiliates. All rights
> reserved.
> + * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights
> reserved.
> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> *
> * This code is free software; you can redistribute it and/or modify it
> @@ -27,21 +27,17 @@
>
> import java.net.URL;
> import java.awt.Image;
> -import sun.misc.Ref;
>
> /**
> * Part of this class still remains only to support legacy, 100%-impure
> * applications such as HotJava 1.0.1.
> */
> + at Deprecated
> public class AppletResourceLoader {
> public static Image getImage(URL url) {
> return AppletViewer.getCachedImage(url);
> }
>
> - public static Ref getImageRef(URL url) {
> - return AppletViewer.getCachedImageRef(url);
> - }
> -
> public static void flushImages() {
> AppletViewer.flushImageCache();
> }
> diff -r 9bf43f25eacd src/share/classes/sun/applet/AppletViewer.java
> --- a/src/share/classes/sun/applet/AppletViewer.java Sat Jan 18
> 10:57:41 2014 -0800
> +++ b/src/share/classes/sun/applet/AppletViewer.java Tue Jan 21
> 10:15:15 2014 -0800
> @@ -35,7 +35,6 @@
> import java.net.URL;
> import java.net.MalformedURLException;
> import java.net.SocketPermission;
> -import sun.misc.Ref;
> import java.security.AccessController;
> import java.security.PrivilegedAction;
> import java.lang.reflect.InvocationTargetException;
> @@ -390,22 +389,18 @@
> return getCachedImage(url);
> }
>
> + /**
> + * Get an image.
> + */
> static Image getCachedImage(URL url) {
> // System.getSecurityManager().checkConnection(url.getHost(),
> url.getPort());
> - return (Image)getCachedImageRef(url).get();
> - }
> -
> - /**
> - * Get an image ref.
> - */
> - static Ref getCachedImageRef(URL url) {
> synchronized (imageRefs) {
> AppletImageRef ref = (AppletImageRef)imageRefs.get(url);
> if (ref == null) {
> ref = new AppletImageRef(url);
> imageRefs.put(url, ref);
> }
> - return ref;
> + return ref.get();
> }
> }
>
> diff -r 9bf43f25eacd src/share/classes/sun/misc/Cache.java
> --- a/src/share/classes/sun/misc/Cache.java Sat Jan 18 10:57:41
> 2014 -0800
> +++ b/src/share/classes/sun/misc/Cache.java Tue Jan 21 10:15:15
> 2014 -0800
> @@ -25,6 +25,7 @@
>
> package sun.misc;
>
> +import java.lang.ref.SoftReference;
> import java.util.Dictionary;
> import java.util.Enumeration;
> import java.util.NoSuchElementException;
> @@ -32,12 +33,26 @@
> /**
> * Caches the collision list.
> */
> -class CacheEntry extends Ref {
> +class CacheEntry {
> int hash;
> Object key;
> CacheEntry next;
> - public Object reconstitute() {
> - return null;
> + SoftReference<Object> value;
> +
> + public CacheEntry() {
> + value = null;
> + }
> +
> + public CacheEntry(Object o) {
> + value = new SoftReference<>(o);
> + }
> +
> + public Object get() {
> + return value.get();
> + }
> +
> + public void setThing(Object thing) {
> + value = new SoftReference<>(thing);
> }
> }
>
> @@ -192,7 +207,7 @@
> int index = (hash & 0x7FFFFFFF) % tab.length;
> for (CacheEntry e = tab[index]; e != null; e = e.next) {
> if ((e.hash == hash) && e.key.equals(key)) {
> - return e.check();
> + return e.get();
> }
> }
> return null;
> @@ -220,7 +235,7 @@
> for (CacheEntry old = oldTable[i]; old != null;) {
> CacheEntry e = old;
> old = old.next;
> - if (e.check() != null) {
> + if (e.get() != null) {
> int index = (e.hash & 0x7FFFFFFF) % newCapacity;
> e.next = newTable[index];
> newTable[index] = e;
> @@ -253,10 +268,10 @@
> CacheEntry ne = null;
> for (CacheEntry e = tab[index]; e != null; e = e.next) {
> if ((e.hash == hash) && e.key.equals(key)) {
> - Object old = e.check();
> + Object old = e.get();
> e.setThing(value);
> return old;
> - } else if (e.check() == null)
> + } else if (e.get() == null)
> ne = e; /* reuse old flushed value */
> }
>
> @@ -296,7 +311,7 @@
> tab[index] = e.next;
> }
> count--;
> - return e.check();
> + return e.get();
> }
> }
> return null;
> @@ -322,7 +337,7 @@
> public boolean hasMoreElements() {
> while (index >= 0) {
> while (entry != null)
> - if (entry.check() != null)
> + if (entry.get() != null)
> return true;
> else
> entry = entry.next;
> @@ -338,8 +353,8 @@
> if (entry != null) {
> CacheEntry e = entry;
> entry = e.next;
> - if (e.check() != null)
> - return keys ? e.key : e.check();
> + if (e.get() != null)
> + return keys ? e.key : e.get();
> }
> }
> throw new NoSuchElementException("CacheEnumerator");
>
>
> # Deletion of sun.misc.Ref elided.
More information about the core-libs-dev
mailing list