summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Kennke <roman@kennke.org>2007-03-27 09:34:49 +0000
committerRoman Kennke <roman@kennke.org>2007-03-27 09:34:49 +0000
commit38b3923ebff100a2654bcc0df731d3d2fc52e452 (patch)
tree4b35647ed3746060b447fa8c3824bcc116b58d16
parenta882c579f8ba63bfa22130f301fbcce838f035ca (diff)
downloadclasspath-38b3923ebff100a2654bcc0df731d3d2fc52e452.tar.gz
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.
-rw-r--r--ChangeLog12
-rw-r--r--java/awt/EventQueue.java14
-rw-r--r--java/awt/Frame.java9
3 files changed, 29 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index d09c988e6..2f5e5ac64 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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));
}
}