6834525: PIT: RowToleranceTransitivityTest test fail with crash on rhel4 x86 and rhel 5x86
Summary: do not try to use released XKB resources
Reviewed-by: art
1.1 --- a/src/solaris/classes/sun/awt/X11/XKeysym.java Fri May 15 15:40:35 2009 +0400
1.2 +++ b/src/solaris/classes/sun/awt/X11/XKeysym.java Mon May 18 12:39:58 2009 +0400
1.3 @@ -29,6 +29,9 @@
1.4 import java.util.Hashtable;
1.5 import sun.misc.Unsafe;
1.6
1.7 +import java.util.logging.Level;
1.8 +import java.util.logging.Logger;
1.9 +
1.10 public class XKeysym {
1.11
1.12 public static void main( String args[] ) {
1.13 @@ -67,6 +70,7 @@
1.14 static Hashtable<Integer, Long> javaKeycode2KeysymHash = new Hashtable<Integer, Long>();
1.15 static long keysym_lowercase = unsafe.allocateMemory(Native.getLongSize());
1.16 static long keysym_uppercase = unsafe.allocateMemory(Native.getLongSize());
1.17 + private static Logger keyEventLog = Logger.getLogger("sun.awt.X11.kye.XKeysym");
1.18 public static char convertKeysym( long ks, int state ) {
1.19
1.20 /* First check for Latin-1 characters (1:1 mapping) */
1.21 @@ -107,8 +111,15 @@
1.22 // clearly means that caller needs a so called primary keysym.
1.23 mods ^= XConstants.ShiftMask;
1.24 }
1.25 - XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(),
1.26 + long kbdDesc = XToolkit.getXKBKbdDesc();
1.27 + if( kbdDesc != 0 ) {
1.28 + XlibWrapper.XkbTranslateKeyCode(kbdDesc, ev.get_keycode(),
1.29 mods, XlibWrapper.iarg1, XlibWrapper.larg3);
1.30 + }else{
1.31 + // xkb resources already gone
1.32 + keyEventLog.fine("Thread race: Toolkit shutdown before the end of a key event processing.");
1.33 + return 0;
1.34 + }
1.35 //XXX unconsumed modifiers?
1.36 return Native.getLong(XlibWrapper.larg3);
1.37 } finally {
2.1 --- a/src/solaris/classes/sun/awt/X11/XToolkit.java Fri May 15 15:40:35 2009 +0400
2.2 +++ b/src/solaris/classes/sun/awt/X11/XToolkit.java Mon May 18 12:39:58 2009 +0400
2.3 @@ -2263,6 +2263,7 @@
2.4 try {
2.5 if (awt_UseXKB_Calls && awt_XKBDescPtr != 0) {
2.6 XlibWrapper.XkbFreeKeyboard(awt_XKBDescPtr, 0xFF, true);
2.7 + awt_XKBDescPtr = 0;
2.8 }
2.9 } finally {
2.10 awtUnlock();
3.1 --- a/src/solaris/classes/sun/awt/X11/keysym2ucs.h Fri May 15 15:40:35 2009 +0400
3.2 +++ b/src/solaris/classes/sun/awt/X11/keysym2ucs.h Mon May 18 12:39:58 2009 +0400
3.3 @@ -67,6 +67,9 @@
3.4 tojava import java.util.Hashtable;
3.5 tojava import sun.misc.Unsafe;
3.6 tojava
3.7 +tojava import java.util.logging.Level;
3.8 +tojava import java.util.logging.Logger;
3.9 +tojava
3.10 tojava public class XKeysym {
3.11 tojava
3.12 tojava public static void main( String args[] ) {
3.13 @@ -105,6 +108,7 @@
3.14 tojava static Hashtable<Integer, Long> javaKeycode2KeysymHash = new Hashtable<Integer, Long>();
3.15 tojava static long keysym_lowercase = unsafe.allocateMemory(Native.getLongSize());
3.16 tojava static long keysym_uppercase = unsafe.allocateMemory(Native.getLongSize());
3.17 +tojava private static Logger keyEventLog = Logger.getLogger("sun.awt.X11.kye.XKeysym");
3.18 tojava public static char convertKeysym( long ks, int state ) {
3.19 tojava
3.20 tojava /* First check for Latin-1 characters (1:1 mapping) */
3.21 @@ -145,8 +149,15 @@
3.22 tojava // clearly means that caller needs a so called primary keysym.
3.23 tojava mods ^= XConstants.ShiftMask;
3.24 tojava }
3.25 -tojava XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(),
3.26 +tojava long kbdDesc = XToolkit.getXKBKbdDesc();
3.27 +tojava if( kbdDesc != 0 ) {
3.28 +tojava XlibWrapper.XkbTranslateKeyCode(kbdDesc, ev.get_keycode(),
3.29 tojava mods, XlibWrapper.iarg1, XlibWrapper.larg3);
3.30 +tojava }else{
3.31 +tojava // xkb resources already gone
3.32 +tojava keyEventLog.fine("Thread race: Toolkit shutdown before the end of a key event processing.");
3.33 +tojava return 0;
3.34 +tojava }
3.35 tojava //XXX unconsumed modifiers?
3.36 tojava return Native.getLong(XlibWrapper.larg3);
3.37 tojava } finally {