diff options
author | Roman Kennke <roman@kennke.org> | 2007-04-04 10:15:14 +0000 |
---|---|---|
committer | Roman Kennke <roman@kennke.org> | 2007-04-04 10:15:14 +0000 |
commit | fcafa909718a15f7607fd53707befb3ac2fac2cc (patch) | |
tree | ef0c566dd5af33c7c780dbae40c152e493c9b3e6 | |
parent | 0d4b4a31da5cf9cb6791dfc2fd836d97e7851888 (diff) | |
download | classpath-fcafa909718a15f7607fd53707befb3ac2fac2cc.tar.gz |
2007-04-04 Roman Kennke <roman@kennke.org>
* java/awt/Frame.java
(weakFrames): Make private.
(weakFramesQueue): New field. A reference queue to collect
GCed references.
(getFrames): Only do one iterations to avoid collecting null
references.
(hasDisplayableFrames): New helper method. Checks if there
are any displayable frames. This is used by the event queue
shutdown check.
(noteFrame): Clean up GCed frames in the list.
* java/awt/EventQueue.java
(isShutdown): Move frame checking code into Frame.
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | java/awt/EventQueue.java | 12 | ||||
-rw-r--r-- | java/awt/Frame.java | 82 |
3 files changed, 70 insertions, 39 deletions
@@ -1,3 +1,18 @@ +2007-04-04 Roman Kennke <roman@kennke.org> + + * java/awt/Frame.java + (weakFrames): Make private. + (weakFramesQueue): New field. A reference queue to collect + GCed references. + (getFrames): Only do one iterations to avoid collecting null + references. + (hasDisplayableFrames): New helper method. Checks if there + are any displayable frames. This is used by the event queue + shutdown check. + (noteFrame): Clean up GCed frames in the list. + * java/awt/EventQueue.java + (isShutdown): Move frame checking code into Frame. + 2007-04-03 Roman Kennke <roman@kennke.org> * java/lang/System.java diff --git a/java/awt/EventQueue.java b/java/awt/EventQueue.java index a76ba1afb..eb17449a0 100644 --- a/java/awt/EventQueue.java +++ b/java/awt/EventQueue.java @@ -48,7 +48,6 @@ 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; @@ -129,15 +128,8 @@ public class EventQueue if (peekEvent() != null) return false; - synchronized (Frame.weakFrames) - { - for (WeakReference<Frame> r : Frame.weakFrames) - { - Frame f = (Frame) r.get(); - if (f != null && f.isDisplayable()) - return false; - } - } + if (Frame.hasDisplayableFrames()) + return false; return true; } diff --git a/java/awt/Frame.java b/java/awt/Frame.java index 970b420eb..3cc8738c6 100644 --- a/java/awt/Frame.java +++ b/java/awt/Frame.java @@ -40,9 +40,10 @@ exception statement from your version. */ package java.awt; import java.awt.peer.FramePeer; +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Iterator; import java.util.Vector; import javax.accessibility.AccessibleContext; @@ -485,48 +486,71 @@ public class Frame extends Window implements MenuContainer } /** - * This is static private because we need to access this efficiently from - * the EventQueue. + * The list of active frames. GC'ed frames get removed in noteFrame(). */ - static ArrayList<WeakReference<Frame>> weakFrames = + private static ArrayList<WeakReference<Frame>> weakFrames = new ArrayList<WeakReference<Frame>>(); + /** + * The death queue for all frames. + */ + private static ReferenceQueue weakFramesQueue = + new ReferenceQueue<Frame>(); + private static void noteFrame(Frame f) { synchronized (weakFrames) { + // Remove GCed frames from the list. + Reference ref = weakFramesQueue.poll(); + while (ref != null) + { + weakFrames.remove(ref); + ref = weakFramesQueue.poll(); + } + // Add new frame. weakFrames.add(new WeakReference<Frame>(f)); } } + /** + * Returns <code>true</code> when there are any displayable frames, + * <code>false</code> otherwise. + * + * @return <code>true</code> when there are any displayable frames, + * <code>false</code> otherwise + */ + static boolean hasDisplayableFrames() + { + synchronized (weakFrames) + { + for (WeakReference<Frame> r : Frame.weakFrames) + { + Frame f = (Frame) r.get(); + if (f != null && f.isDisplayable()) + return true; + } + } + return false; + } + public static Frame[] getFrames() { - int n = 0; synchronized (weakFrames) - { - Iterator i = weakFrames.iterator(); - while (i.hasNext()) - { - WeakReference wr = (WeakReference) i.next(); - if (wr.get() != null) - ++n; - } - if (n == 0) - return new Frame[0]; - else - { - Frame[] frames = new Frame[n]; - n = 0; - i = weakFrames.iterator(); - while (i.hasNext()) - { - WeakReference wr = (WeakReference) i.next(); - if (wr.get() != null) - frames[n++] = (Frame) wr.get(); - } - return frames; - } - } + { + ArrayList<Frame> existingFrames = new ArrayList<Frame>(); + for (WeakReference<Frame> ref : weakFrames) + { + Frame f = ref.get(); + if (f != null) + { + existingFrames.add(f); + } + } + Frame[] frames = new Frame[existingFrames.size()]; + frames = existingFrames.toArray(frames); + return frames; + } } public void setState(int state) |