changeset 5048:82e3c4a6bfd8

7145980: Dispose method of window.java takes long Reviewed-by: anthony
author bagiras
date Fri, 24 Feb 2012 13:50:37 +0400
parents 75247b827d6c
children 52fa1b465a3b
files src/share/classes/java/awt/Component.java src/share/classes/java/awt/Window.java
diffstat 2 files changed, 42 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/awt/Component.java	Wed Feb 22 22:09:53 2012 -0800
+++ b/src/share/classes/java/awt/Component.java	Fri Feb 24 13:50:37 2012 +0400
@@ -10070,11 +10070,12 @@
         }
         Window window = getContainingWindow();
         if (window != null) {
-            if (!window.hasHeavyweightDescendants() || !window.hasLightweightDescendants()) {
+            if (!window.hasHeavyweightDescendants() || !window.hasLightweightDescendants() || window.isDisposing()) {
                 if (mixingLog.isLoggable(PlatformLogger.FINE)) {
                     mixingLog.fine("containing window = " + window +
                             "; has h/w descendants = " + window.hasHeavyweightDescendants() +
-                            "; has l/w descendants = " + window.hasLightweightDescendants());
+                            "; has l/w descendants = " + window.hasLightweightDescendants() +
+                            "; disposing = " + window.isDisposing());
                 }
                 return false;
             }
--- a/src/share/classes/java/awt/Window.java	Wed Feb 22 22:09:53 2012 -0800
+++ b/src/share/classes/java/awt/Window.java	Fri Feb 24 13:50:37 2012 +0400
@@ -226,6 +226,7 @@
     static boolean systemSyncLWRequests = false;
     boolean     syncLWRequests = false;
     transient boolean beforeFirstShow = true;
+    private transient boolean disposing = false;
 
     static final int OPENED = 0x01;
 
@@ -1162,36 +1163,41 @@
     void doDispose() {
     class DisposeAction implements Runnable {
         public void run() {
-            // Check if this window is the fullscreen window for the
-            // device. Exit the fullscreen mode prior to disposing
-            // of the window if that's the case.
-            GraphicsDevice gd = getGraphicsConfiguration().getDevice();
-            if (gd.getFullScreenWindow() == Window.this) {
-                gd.setFullScreenWindow(null);
+            disposing = true;
+            try {
+                // Check if this window is the fullscreen window for the
+                // device. Exit the fullscreen mode prior to disposing
+                // of the window if that's the case.
+                GraphicsDevice gd = getGraphicsConfiguration().getDevice();
+                if (gd.getFullScreenWindow() == Window.this) {
+                    gd.setFullScreenWindow(null);
+                }
+
+                Object[] ownedWindowArray;
+                synchronized(ownedWindowList) {
+                    ownedWindowArray = new Object[ownedWindowList.size()];
+                    ownedWindowList.copyInto(ownedWindowArray);
+                }
+                for (int i = 0; i < ownedWindowArray.length; i++) {
+                    Window child = (Window) (((WeakReference)
+                                   (ownedWindowArray[i])).get());
+                    if (child != null) {
+                        child.disposeImpl();
+                    }
+                }
+                hide();
+                beforeFirstShow = true;
+                removeNotify();
+                synchronized (inputContextLock) {
+                    if (inputContext != null) {
+                        inputContext.dispose();
+                        inputContext = null;
+                    }
+                }
+                clearCurrentFocusCycleRootOnHide();
+            } finally {
+                disposing = false;
             }
-
-            Object[] ownedWindowArray;
-            synchronized(ownedWindowList) {
-                ownedWindowArray = new Object[ownedWindowList.size()];
-                ownedWindowList.copyInto(ownedWindowArray);
-            }
-            for (int i = 0; i < ownedWindowArray.length; i++) {
-                Window child = (Window) (((WeakReference)
-                               (ownedWindowArray[i])).get());
-                if (child != null) {
-                    child.disposeImpl();
-                }
-            }
-            hide();
-            beforeFirstShow = true;
-            removeNotify();
-            synchronized (inputContextLock) {
-                if (inputContext != null) {
-                    inputContext.dispose();
-                    inputContext = null;
-                }
-            }
-            clearCurrentFocusCycleRootOnHide();
         }
     }
         DisposeAction action = new DisposeAction();
@@ -2734,6 +2740,10 @@
         return visible;
     }
 
+    boolean isDisposing() {
+        return disposing;
+    }
+
     /**
      * @deprecated As of J2SE 1.4, replaced by
      * {@link Component#applyComponentOrientation Component.applyComponentOrientation}.