--- a/jdk/src/share/classes/java/awt/Component.java Tue Jun 10 13:42:42 2008 -0700
+++ b/jdk/src/share/classes/java/awt/Component.java Wed Jun 11 01:31:42 2008 -0700
@@ -635,11 +635,21 @@
*/
private PropertyChangeSupport changeSupport;
- // Note: this field is considered final, though readObject() prohibits
- // initializing final fields.
- private transient Object changeSupportLock = new Object();
- private Object getChangeSupportLock() {
- return changeSupportLock;
+ /*
+ * In some cases using "this" as an object to synchronize by
+ * can lead to a deadlock if client code also uses synchronization
+ * by a component object. For every such situation revealed we should
+ * consider possibility of replacing "this" with the package private
+ * objectLock object introduced below. So far there're 2 issues known:
+ * - CR 6708322 (the getName/setName methods);
+ * - CR 6608764 (the PropertyChangeListener machinery).
+ *
+ * Note: this field is considered final, though readObject() prohibits
+ * initializing final fields.
+ */
+ private transient Object objectLock = new Object();
+ Object getObjectLock() {
+ return objectLock;
}
boolean isPacked = false;
@@ -812,7 +822,7 @@
*/
public String getName() {
if (name == null && !nameExplicitlySet) {
- synchronized(this) {
+ synchronized(getObjectLock()) {
if (name == null && !nameExplicitlySet)
name = constructComponentName();
}
@@ -829,7 +839,7 @@
*/
public void setName(String name) {
String oldName;
- synchronized(this) {
+ synchronized(getObjectLock()) {
oldName = this.name;
this.name = name;
nameExplicitlySet = true;
@@ -7838,7 +7848,7 @@
*/
public void addPropertyChangeListener(
PropertyChangeListener listener) {
- synchronized (getChangeSupportLock()) {
+ synchronized (getObjectLock()) {
if (listener == null) {
return;
}
@@ -7864,7 +7874,7 @@
*/
public void removePropertyChangeListener(
PropertyChangeListener listener) {
- synchronized (getChangeSupportLock()) {
+ synchronized (getObjectLock()) {
if (listener == null || changeSupport == null) {
return;
}
@@ -7887,7 +7897,7 @@
* @since 1.4
*/
public PropertyChangeListener[] getPropertyChangeListeners() {
- synchronized (getChangeSupportLock()) {
+ synchronized (getObjectLock()) {
if (changeSupport == null) {
return new PropertyChangeListener[0];
}
@@ -7929,7 +7939,7 @@
public void addPropertyChangeListener(
String propertyName,
PropertyChangeListener listener) {
- synchronized (getChangeSupportLock()) {
+ synchronized (getObjectLock()) {
if (listener == null) {
return;
}
@@ -7959,7 +7969,7 @@
public void removePropertyChangeListener(
String propertyName,
PropertyChangeListener listener) {
- synchronized (getChangeSupportLock()) {
+ synchronized (getObjectLock()) {
if (listener == null || changeSupport == null) {
return;
}
@@ -7983,7 +7993,7 @@
*/
public PropertyChangeListener[] getPropertyChangeListeners(
String propertyName) {
- synchronized (getChangeSupportLock()) {
+ synchronized (getObjectLock()) {
if (changeSupport == null) {
return new PropertyChangeListener[0];
}
@@ -8004,7 +8014,7 @@
protected void firePropertyChange(String propertyName,
Object oldValue, Object newValue) {
PropertyChangeSupport changeSupport;
- synchronized (getChangeSupportLock()) {
+ synchronized (getObjectLock()) {
changeSupport = this.changeSupport;
}
if (changeSupport == null ||
@@ -8306,7 +8316,7 @@
private void readObject(ObjectInputStream s)
throws ClassNotFoundException, IOException
{
- changeSupportLock = new Object();
+ objectLock = new Object();
s.defaultReadObject();
--- a/jdk/src/share/classes/java/awt/SystemTray.java Tue Jun 10 13:42:42 2008 -0700
+++ b/jdk/src/share/classes/java/awt/SystemTray.java Wed Jun 11 01:31:42 2008 -0700
@@ -125,6 +125,8 @@
transient private SystemTrayPeer peer;
+ private static final TrayIcon[] EMPTY_TRAY_ARRAY = new TrayIcon[0];
+
/**
* Private <code>SystemTray</code> constructor.
*
@@ -203,13 +205,12 @@
public static boolean isSupported() {
initializeSystemTrayIfNeeded();
- if (Toolkit.getDefaultToolkit() instanceof SunToolkit) {
-
- return ((SunToolkit)Toolkit.getDefaultToolkit()).isTraySupported();
+ Toolkit toolkit = Toolkit.getDefaultToolkit();
- } else if (Toolkit.getDefaultToolkit() instanceof HeadlessToolkit) {
-
- return ((HeadlessToolkit)Toolkit.getDefaultToolkit()).isTraySupported();
+ if (toolkit instanceof SunToolkit) {
+ return ((SunToolkit)toolkit).isTraySupported();
+ } else if (toolkit instanceof HeadlessToolkit) {
+ return ((HeadlessToolkit)toolkit).isTraySupported();
}
return false;
}
@@ -323,7 +324,7 @@
if (icons != null) {
return (TrayIcon[])icons.toArray(new TrayIcon[icons.size()]);
}
- return new TrayIcon[0];
+ return EMPTY_TRAY_ARRAY;
}
/**
--- a/jdk/src/share/classes/java/awt/TrayIcon.java Tue Jun 10 13:42:42 2008 -0700
+++ b/jdk/src/share/classes/java/awt/TrayIcon.java Wed Jun 11 01:31:42 2008 -0700
@@ -142,9 +142,6 @@
*/
public TrayIcon(Image image) {
this();
- if (image == null) {
- throw new IllegalArgumentException("creating TrayIcon with null Image");
- }
setImage(image);
}
@@ -433,7 +430,7 @@
* @see java.awt.event.MouseListener
*/
public synchronized MouseListener[] getMouseListeners() {
- return (MouseListener[])(getListeners(MouseListener.class));
+ return AWTEventMulticaster.getListeners(mouseListener, MouseListener.class);
}
/**
@@ -494,7 +491,7 @@
* @see java.awt.event.MouseMotionListener
*/
public synchronized MouseMotionListener[] getMouseMotionListeners() {
- return (MouseMotionListener[]) (getListeners(MouseMotionListener.class));
+ return AWTEventMulticaster.getListeners(mouseMotionListener, MouseMotionListener.class);
}
/**
@@ -581,7 +578,7 @@
* @see java.awt.event.ActionListener
*/
public synchronized ActionListener[] getActionListeners() {
- return (ActionListener[])(getListeners(ActionListener.class));
+ return AWTEventMulticaster.getListeners(actionListener, ActionListener.class);
}
/**
@@ -635,7 +632,7 @@
TrayIconPeer peer = this.peer;
if (peer != null) {
- peer.displayMessage(caption, text, messageType.toString());
+ peer.displayMessage(caption, text, messageType.name());
}
}
@@ -657,18 +654,6 @@
// ****************************************************************
// ****************************************************************
- <T extends EventListener> T[] getListeners(Class<T> listenerType) {
- EventListener l = null;
- if (listenerType == MouseListener.class) {
- l = mouseListener;
- } else if (listenerType == MouseMotionListener.class) {
- l = mouseMotionListener;
- } else if (listenerType == ActionListener.class) {
- l = actionListener;
- }
- return AWTEventMulticaster.getListeners(l, listenerType);
- }
-
void addNotify()
throws AWTException
{