# HG changeset patch # User bagiras # Date 1330077037 -14400 # Node ID 9e19ca1ff7077ef644250bbcb15253f7f6cc89eb # Parent 17ee27e76ef4b7d6ee51575a7dfe2f55c33f181a 7145980: Dispose method of window.java takes long Reviewed-by: anthony diff -r 17ee27e76ef4 -r 9e19ca1ff707 jdk/src/share/classes/java/awt/Component.java --- a/jdk/src/share/classes/java/awt/Component.java Wed Feb 22 22:09:53 2012 -0800 +++ b/jdk/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; } diff -r 17ee27e76ef4 -r 9e19ca1ff707 jdk/src/share/classes/java/awt/Window.java --- a/jdk/src/share/classes/java/awt/Window.java Wed Feb 22 22:09:53 2012 -0800 +++ b/jdk/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); - } - - Object[] ownedWindowArray; - synchronized(ownedWindowList) { - ownedWindowArray = new Object[ownedWindowList.size()]; - ownedWindowList.copyInto(ownedWindowArray); + 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; } - 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}.