[icedtea-web] RFC: Fix for PR852: Classloader not being flushed after close

Omair Majid omajid at redhat.com
Thu Jan 26 18:55:09 PST 2012


Hi Deepak,

On 01/26/2012 01:18 PM, Deepak Bhole wrote:
> This patch fixes PR852. I would like to put it in 1.2 in addition to
> HEAD.

I have a few on the patch comments below.

> diff -r 41f03d932cdf netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
> --- a/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java	Mon Jan 09 18:45:31 2012 -0500
> +++ b/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java	Thu Jan 26 13:15:59 2012 -0500

> +    public static void incrementLoaderCount(JNLPClassLoader loader) {

> +    public static void decrementLoaderCount(JNLPClassLoader loader) {

Just a thought, but it might be cleaner to make these instance methods, 
since they always operate on a loader object. With that changes, this 
becomes:

public void incrementLoaderCount()
public void decrementLoaderCount()

In fact, incrementLoaderCount does not even have to be public. If we do 
go down that route, perhaps we can also go ahead and rename 
decrementLoaderCount to dispose() or release()? (I am also thinking 
close() but that would clash with the URLClassLoader's close() method in 
OpenJDK7.) I think it makes the purpose clearer in that this method 
releases resources associated with the classloader. It also hides the 
fact that we are caching something from the users of the JNLPClassLaoder 
api.

> +        synchronized(loader.useCount) {
> +            loader.useCount--;
> +
> +            if (loader.useCount<= 0) {
> +                synchronized(urlToLoader) {
> +                    urlToLoader.remove(loader.file.getUniqueKey());
> +                }
> +            }
> +        }
> +    }
>

Synchronizing over Integer (or Long) has always looked scary to me. I am 
not sure if this is a problem in this case, but as soon as you do the 
post increment, the object (useCount) has changed. If another thread 
comes along at this point, it can now synchronize over the new object 
and it would be possible to have two threads enter the same synchronized 
block. I am attaching a program that shows that the Integer has indeed 
changed.

> diff -r 41f03d932cdf plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
> --- a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Mon Jan 09 18:45:31 2012 -0500
> +++ b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Thu Jan 26 13:15:59 2012 -0500
> @@ -1625,6 +1625,9 @@
>
>                   appletShutdown(p);
>                   appletPanels.removeElement(p);
> +
> +                // Mark classloader unusable
> +                JNLPClassLoader.decrementLoaderCount((JNLPClassLoader) cl);
>
>                   try {
>                       SwingUtilities.invokeAndWait(new Runnable() {
>

Not being an expert, I am not sure about the details of how this fixes 
the problem. If the _only_ problem was that we are maintaining a 
reference to the classloader, perhaps making urlToLoader a Map<String, 
WeakReference<JNLPClassLoader>> might be more appropriate? Or is there 
something I am missing?

Sorry if this is not very helpful - I took a look at bugzilla but I 
could not find the actual issue described there.

Cheers,
Omair
-------------- next part --------------
A non-text attachment was scrubbed...
Name: IntegerSynchronization.java
Type: text/x-java
Size: 423 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/distro-pkg-dev/attachments/20120126/43ace04d/IntegerSynchronization.java 


More information about the distro-pkg-dev mailing list