summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Kennke <roman@kennke.org>2007-04-04 10:15:14 +0000
committerRoman Kennke <roman@kennke.org>2007-04-04 10:15:14 +0000
commitfcafa909718a15f7607fd53707befb3ac2fac2cc (patch)
treeef0c566dd5af33c7c780dbae40c152e493c9b3e6
parent0d4b4a31da5cf9cb6791dfc2fd836d97e7851888 (diff)
downloadclasspath-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--ChangeLog15
-rw-r--r--java/awt/EventQueue.java12
-rw-r--r--java/awt/Frame.java82
3 files changed, 70 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index 8f47fe256..e0ec23e93 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)