diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | java/awt/EventQueue.java | 14 | ||||
-rw-r--r-- | java/awt/Frame.java | 9 |
3 files changed, 29 insertions, 6 deletions
@@ -1,5 +1,17 @@ 2007-03-27 Roman Kennke <kennke@aicas.com> + * java/awt/Frame.java + (weakFrames): Make this generic and package private. + (noteFrame): Use generic WeakReference. + * java/awt/EventQueue.java + (isShutdown): Iterate over the weakFrames directly, rather than + using Frame.getFrames(). The latter iterates several times over + weakFrames completely and creates a new array on each call. The + former iterates only once and aborts when it finds a frame which + is displayable. + +2007-03-27 Roman Kennke <kennke@aicas.com> + * javax/swing/JScrollBar.java (getUnitIncrement(int)): Don't multiply direction parameter. (getBlockIncrement(int)): Don't multiply direction parameter. diff --git a/java/awt/EventQueue.java b/java/awt/EventQueue.java index 74dbd5fb6..a76ba1afb 100644 --- a/java/awt/EventQueue.java +++ b/java/awt/EventQueue.java @@ -48,6 +48,7 @@ import java.awt.event.InvocationEvent; import java.awt.event.PaintEvent; import java.awt.peer.ComponentPeer; import java.awt.peer.LightweightPeer; +import java.lang.ref.WeakReference; import java.lang.reflect.InvocationTargetException; import java.util.EmptyStackException; @@ -128,10 +129,15 @@ public class EventQueue if (peekEvent() != null) return false; - Frame[] frames = Frame.getFrames(); - for (int i = 0; i < frames.length; ++i) - if (frames[i].isDisplayable()) - return false; + synchronized (Frame.weakFrames) + { + for (WeakReference<Frame> r : Frame.weakFrames) + { + Frame f = (Frame) r.get(); + if (f != null && f.isDisplayable()) + return false; + } + } return true; } diff --git a/java/awt/Frame.java b/java/awt/Frame.java index d5cc7f531..970b420eb 100644 --- a/java/awt/Frame.java +++ b/java/awt/Frame.java @@ -484,13 +484,18 @@ public class Frame extends Window implements MenuContainer return super.paramString () + ",title=" + title + resizable + state; } - private static ArrayList weakFrames = new ArrayList(); + /** + * This is static private because we need to access this efficiently from + * the EventQueue. + */ + static ArrayList<WeakReference<Frame>> weakFrames = + new ArrayList<WeakReference<Frame>>(); private static void noteFrame(Frame f) { synchronized (weakFrames) { - weakFrames.add(new WeakReference(f)); + weakFrames.add(new WeakReference<Frame>(f)); } } |