From 3a2ff1374b9ab1af79ef93a39a8236da86fd2747 Mon Sep 17 00:00:00 2001 From: Semyon Sadetsky Date: Fri, 8 May 2015 17:35:15 +0300 Subject: [PATCH] 7155957: closed/java/awt/MenuBar/MenuBarStress1/MenuBarStress1.java hangs on win 64 bit with jdk8 Reviewed-by: serb, ant --- .../java.desktop/share/classes/java/awt/Menu.java | 2 +- .../share/classes/java/awt/MenuBar.java | 4 ++-- .../share/classes/java/awt/MenuComponent.java | 14 ++++++++------ .../classes/sun/awt/windows/WObjectPeer.java | 4 ++-- .../windows/native/libawt/windows/awt_Menu.cpp | 8 +++++--- .../windows/native/libawt/windows/awt_MenuBar.cpp | 5 ++++- .../windows/native/libawt/windows/awt_MenuItem.cpp | 1 + .../windows/native/libawt/windows/awt_new.cpp | 3 +++ 8 files changed, 26 insertions(+), 15 deletions(-) diff --git a/jdk/src/java.desktop/share/classes/java/awt/Menu.java b/jdk/src/java.desktop/share/classes/java/awt/Menu.java index 4f4a2099c55..af7d4c6b734 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/Menu.java +++ b/jdk/src/java.desktop/share/classes/java/awt/Menu.java @@ -413,9 +413,9 @@ public class Menu extends MenuItem implements MenuContainer, Accessible { items.removeElementAt(index); MenuPeer peer = (MenuPeer)this.peer; if (peer != null) { + peer.delItem(index); mi.removeNotify(); mi.parent = null; - peer.delItem(index); } } } diff --git a/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java b/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java index 648441e68ef..5ba87f646b9 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java +++ b/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java @@ -222,7 +222,6 @@ public class MenuBar extends MenuComponent implements MenuContainer, Accessible if (m.parent != null) { m.parent.remove(m); } - menus.addElement(m); m.parent = this; MenuBarPeer peer = (MenuBarPeer)this.peer; @@ -232,6 +231,7 @@ public class MenuBar extends MenuComponent implements MenuContainer, Accessible } peer.addMenu(m); } + menus.addElement(m); return m; } } @@ -248,9 +248,9 @@ public class MenuBar extends MenuComponent implements MenuContainer, Accessible menus.removeElementAt(index); MenuBarPeer peer = (MenuBarPeer)this.peer; if (peer != null) { + peer.delMenu(index); m.removeNotify(); m.parent = null; - peer.delMenu(index); } if (helpMenu == m) { helpMenu = null; diff --git a/jdk/src/java.desktop/share/classes/java/awt/MenuComponent.java b/jdk/src/java.desktop/share/classes/java/awt/MenuComponent.java index 6c1bbf200d6..b99e1c3eb7f 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/MenuComponent.java +++ b/jdk/src/java.desktop/share/classes/java/awt/MenuComponent.java @@ -77,7 +77,7 @@ public abstract class MenuComponent implements java.io.Serializable { * @see #setFont(Font) * @see #getFont() */ - Font font; + volatile Font font; /** * The menu component's name, which defaults to null. @@ -302,11 +302,13 @@ public abstract class MenuComponent implements java.io.Serializable { * @see java.awt.font.TextAttribute */ public void setFont(Font f) { - font = f; - //Fixed 6312943: NullPointerException in method MenuComponent.setFont(Font) - MenuComponentPeer peer = this.peer; - if (peer != null) { - peer.setFont(f); + synchronized (getTreeLock()) { + font = f; + //Fixed 6312943: NullPointerException in method MenuComponent.setFont(Font) + MenuComponentPeer peer = this.peer; + if (peer != null) { + peer.setFont(f); + } } } diff --git a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WObjectPeer.java b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WObjectPeer.java index 843b15f83d1..83f7c586f2a 100644 --- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WObjectPeer.java +++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WObjectPeer.java @@ -31,9 +31,9 @@ abstract class WObjectPeer { } // The Windows handle for the native widget. - long pData; + volatile long pData; // if the native peer has been destroyed - boolean destroyed = false; + volatile boolean destroyed = false; // The associated AWT object. Object target; diff --git a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Menu.cpp b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Menu.cpp index 8bea41c88e3..d452f148012 100644 --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Menu.cpp +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Menu.cpp @@ -239,6 +239,7 @@ AwtMenuItem* AwtMenu::GetItem(jobject target, jint index) } jobject menuItem = env->CallObjectMethod(target, AwtMenu::getItemMID, index); + if (!menuItem) return NULL; // menu item was removed concurrently DASSERT(!safe_ExceptionOccurred(env)); jobject wMenuItemPeer = GetPeerForTarget(env, menuItem); @@ -264,9 +265,9 @@ void AwtMenu::DrawItems(DRAWITEMSTRUCT& drawInfo) } /* target is a java.awt.Menu */ jobject target = GetTarget(env); - + if(!target || env->ExceptionCheck()) return; int nCount = CountItem(target); - for (int i = 0; i < nCount; i++) { + for (int i = 0; i < nCount && !env->ExceptionCheck(); i++) { AwtMenuItem* awtMenuItem = GetItem(target, i); if (awtMenuItem != NULL) { SendDrawItem(awtMenuItem, drawInfo); @@ -294,8 +295,9 @@ void AwtMenu::MeasureItems(HDC hDC, MEASUREITEMSTRUCT& measureInfo) } /* target is a java.awt.Menu */ jobject target = GetTarget(env); + if(!target || env->ExceptionCheck()) return; int nCount = CountItem(target); - for (int i = 0; i < nCount; i++) { + for (int i = 0; i < nCount && !env->ExceptionCheck(); i++) { AwtMenuItem* awtMenuItem = GetItem(target, i); if (awtMenuItem != NULL) { SendMeasureItem(awtMenuItem, hDC, measureInfo); diff --git a/jdk/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.cpp b/jdk/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.cpp index c600d8d36ac..d15e2809a73 100644 --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.cpp +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_MenuBar.cpp @@ -156,13 +156,16 @@ AwtMenuItem* AwtMenuBar::GetItem(jobject target, long index) } jobject menu = env->CallObjectMethod(target, AwtMenuBar::getMenuMID,index); + if (!menu) return NULL; // menu item was removed concurrently DASSERT(!safe_ExceptionOccurred(env)); jobject menuItemPeer = GetPeerForTarget(env, menu); PDATA pData; - JNI_CHECK_PEER_RETURN_NULL(menuItemPeer); + JNI_CHECK_PEER_GOTO(menuItemPeer, done); + AwtMenuItem* awtMenuItem = (AwtMenuItem*)pData; +done: env->DeleteLocalRef(menu); env->DeleteLocalRef(menuItemPeer); diff --git a/jdk/src/java.desktop/windows/native/libawt/windows/awt_MenuItem.cpp b/jdk/src/java.desktop/windows/native/libawt/windows/awt_MenuItem.cpp index c0a0120c79e..ba0488187c5 100644 --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_MenuItem.cpp +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_MenuItem.cpp @@ -112,6 +112,7 @@ void AwtMenuItem::Dispose() JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); if (m_peerObject != NULL) { + JNI_SET_DESTROYED(m_peerObject); JNI_SET_PDATA(m_peerObject, NULL); env->DeleteGlobalRef(m_peerObject); m_peerObject = NULL; diff --git a/jdk/src/java.desktop/windows/native/libawt/windows/awt_new.cpp b/jdk/src/java.desktop/windows/native/libawt/windows/awt_new.cpp index e5adec25b56..b2d133f2350 100644 --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_new.cpp +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_new.cpp @@ -172,6 +172,9 @@ safe_ExceptionOccurred(JNIEnv *env) throw (std::bad_alloc) { env->ExceptionClear(); // rethrow exception env->Throw(xcp); + // temp solution to reveal all concurrency issues in jtreg and JCK + // we will switch it back to silent mode before the release + env->ExceptionDescribe(); return xcp; } }