6834525: PIT: RowToleranceTransitivityTest test fail with crash on rhel4 x86 and rhel 5x86
authoryan
Mon, 18 May 2009 12:39:58 +0400
changeset 1217019fd945ebc5
parent 1216 f62f7fcc9965
child 1218 875524a2b311
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
src/solaris/classes/sun/awt/X11/XKeysym.java
src/solaris/classes/sun/awt/X11/XToolkit.java
src/solaris/classes/sun/awt/X11/keysym2ucs.h
     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 {