summaryrefslogtreecommitdiff
path: root/libjava/classpath/java/awt/Frame.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/java/awt/Frame.java')
-rw-r--r--libjava/classpath/java/awt/Frame.java85
1 files changed, 57 insertions, 28 deletions
diff --git a/libjava/classpath/java/awt/Frame.java b/libjava/classpath/java/awt/Frame.java
index d5cc7f53197..3cc8738c63f 100644
--- a/libjava/classpath/java/awt/Frame.java
+++ b/libjava/classpath/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;
@@ -484,44 +485,72 @@ public class Frame extends Window implements MenuContainer
return super.paramString () + ",title=" + title + resizable + state;
}
- private static ArrayList weakFrames = new ArrayList();
+ /**
+ * The list of active frames. GC'ed frames get removed in noteFrame().
+ */
+ 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)
{
- weakFrames.add(new WeakReference(f));
+ // 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)