6616095: AWT's WindowDisposerRecord keeps AppContext alive too long
authorson
Thu, 13 Mar 2008 16:12:56 +0300
changeset 106 e8dca729bb5b
parent 105 e08ac2105adc
child 107 ed0c7cfb3666
6616095: AWT's WindowDisposerRecord keeps AppContext alive too long Summary: WindowDisposerRecord should not keep strong reference to AppContext. Reviewed-by: art
jdk/src/share/classes/java/awt/Window.java
--- a/jdk/src/share/classes/java/awt/Window.java	Thu Mar 13 15:36:31 2008 +0300
+++ b/jdk/src/share/classes/java/awt/Window.java	Thu Mar 13 16:12:56 2008 +0300
@@ -1,5 +1,5 @@
 /*
- * Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1995-2008 Sun Microsystems, Inc.  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
@@ -24,7 +24,6 @@
  */
 package java.awt;
 
-import java.applet.Applet;
 import java.awt.event.*;
 import java.awt.im.InputContext;
 import java.awt.image.BufferStrategy;
@@ -355,18 +354,21 @@
     static class WindowDisposerRecord implements sun.java2d.DisposerRecord {
         final WeakReference<Window> owner;
         final WeakReference weakThis;
-        final AppContext context;
+        final WeakReference<AppContext> context;
         WindowDisposerRecord(AppContext context, Window victim) {
             owner = new WeakReference<Window>(victim.getOwner());
             weakThis = victim.weakThis;
-            this.context = context;
+            this.context = new WeakReference<AppContext>(context);
         }
         public void dispose() {
             Window parent = owner.get();
             if (parent != null) {
                 parent.removeOwnedWindow(weakThis);
             }
-            Window.removeFromWindowList(context, weakThis);
+            AppContext ac = context.get();
+            if (null != ac) {
+                Window.removeFromWindowList(ac, weakThis);
+            }
         }
     }