6678385: Random java.lang.StackOverflowError from various JDKs
authorart
Fri, 15 May 2009 15:40:35 +0400
changeset 1216f62f7fcc9965
parent 1198 b28b073e72b6
child 1217 019fd945ebc5
6678385: Random java.lang.StackOverflowError from various JDKs
Reviewed-by: stayer
make/sun/xawt/mapfile-vers
src/solaris/classes/sun/awt/X11/MotifDnDConstants.java
src/solaris/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java
src/solaris/classes/sun/awt/X11/MotifDnDDropTargetProtocol.java
src/solaris/classes/sun/awt/X11/WindowPropertyGetter.java
src/solaris/classes/sun/awt/X11/XAWTXSettings.java
src/solaris/classes/sun/awt/X11/XDecoratedPeer.java
src/solaris/classes/sun/awt/X11/XDnDDragSourceProtocol.java
src/solaris/classes/sun/awt/X11/XDnDDropTargetProtocol.java
src/solaris/classes/sun/awt/X11/XDragSourceProtocol.java
src/solaris/classes/sun/awt/X11/XDropTargetRegistry.java
src/solaris/classes/sun/awt/X11/XEmbedCanvasPeer.java
src/solaris/classes/sun/awt/X11/XErrorHandler.java
src/solaris/classes/sun/awt/X11/XProtocol.java
src/solaris/classes/sun/awt/X11/XQueryTree.java
src/solaris/classes/sun/awt/X11/XToolkit.java
src/solaris/classes/sun/awt/X11/XTranslateCoordinates.java
src/solaris/classes/sun/awt/X11/XWM.java
src/solaris/classes/sun/awt/X11/XlibUtil.java
src/solaris/classes/sun/awt/X11/XlibWrapper.java
src/solaris/native/sun/awt/awt_GraphicsEnv.c
src/solaris/native/sun/awt/awt_InputMethod.c
src/solaris/native/sun/awt/awt_MToolkit.c
src/solaris/native/sun/xawt/XToolkit.c
src/solaris/native/sun/xawt/XlibWrapper.c
     1.1 --- a/make/sun/xawt/mapfile-vers	Wed May 06 20:06:23 2009 +0400
     1.2 +++ b/make/sun/xawt/mapfile-vers	Fri May 15 15:40:35 2009 +0400
     1.3 @@ -128,6 +128,7 @@
     1.4          Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler;
     1.5          Java_sun_awt_X11_XlibWrapper_XSetErrorHandler;
     1.6          Java_sun_awt_X11_XlibWrapper_CallErrorHandler;
     1.7 +        Java_sun_awt_X11_XlibWrapper_PrintXErrorEvent;
     1.8          Java_sun_awt_X11_XlibWrapper_XInternAtoms;
     1.9          Java_sun_awt_X11_XlibWrapper_XChangeWindowAttributes;
    1.10          Java_sun_awt_X11_XlibWrapper_XDeleteProperty;
    1.11 @@ -276,7 +277,6 @@
    1.12          Java_sun_awt_X11_XToolkit_getDefaultXColormap;
    1.13          Java_sun_awt_X11_XToolkit_getDefaultScreenData;
    1.14          Java_sun_awt_X11_XToolkit_getEnv;
    1.15 -        Java_sun_awt_X11_XToolkit_setNoisyXErrorHandler;
    1.16          Java_sun_awt_X11_XlibWrapper_XCreateBitmapFromData;
    1.17          Java_sun_awt_X11_XlibWrapper_XFreePixmap;
    1.18          Java_sun_awt_X11_XlibWrapper_XAllocColor;
     2.1 --- a/src/solaris/classes/sun/awt/X11/MotifDnDConstants.java	Wed May 06 20:06:23 2009 +0400
     2.2 +++ b/src/solaris/classes/sun/awt/X11/MotifDnDConstants.java	Fri May 15 15:40:35 2009 +0400
     2.3 @@ -120,7 +120,7 @@
     2.4                                                              false,
     2.5                                                              XConstants.AnyPropertyType);
     2.6          try {
     2.7 -            int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
     2.8 +            int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
     2.9  
    2.10              if (status == XConstants.Success &&
    2.11                  wpg.getData() != 0 &&
    2.12 @@ -190,7 +190,7 @@
    2.13                  try {
    2.14                      Native.putLong(data, motifWindow);
    2.15  
    2.16 -                    XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    2.17 +                    XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    2.18                      XlibWrapper.XChangeProperty(XToolkit.getDisplay(),
    2.19                                                  defaultRootWindow,
    2.20                                                  XA_MOTIF_DRAG_WINDOW.getAtom(),
    2.21 @@ -280,7 +280,7 @@
    2.22                                                              false,
    2.23                                                              XA_MOTIF_DRAG_TARGETS.getAtom());
    2.24          try {
    2.25 -            int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
    2.26 +            int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    2.27  
    2.28              if (status != XConstants.Success
    2.29                  || wpg.getActualType() != XA_MOTIF_DRAG_TARGETS.getAtom()
    2.30 @@ -394,7 +394,7 @@
    2.31                  }
    2.32              }
    2.33  
    2.34 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    2.35 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    2.36              XlibWrapper.XChangeProperty(XToolkit.getDisplay(),
    2.37                                          motifWindow,
    2.38                                          XA_MOTIF_DRAG_TARGETS.getAtom(),
    2.39 @@ -410,7 +410,7 @@
    2.40                  // Create a new motif window and retry.
    2.41                  motifWindow = createMotifWindow();
    2.42  
    2.43 -                XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    2.44 +                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    2.45                  XlibWrapper.XChangeProperty(XToolkit.getDisplay(),
    2.46                                              motifWindow,
    2.47                                              XA_MOTIF_DRAG_TARGETS.getAtom(),
    2.48 @@ -534,7 +534,7 @@
    2.49              // CARD32 icc_handle
    2.50              unsafe.putInt(structData + 4, (int)XA_MOTIF_ATOM_0.getAtom());
    2.51  
    2.52 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    2.53 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    2.54              XlibWrapper.XChangeProperty(XToolkit.getDisplay(), window,
    2.55                                          XA_MOTIF_ATOM_0.getAtom(),
    2.56                                          XA_MOTIF_DRAG_INITIATOR_INFO.getAtom(),
    2.57 @@ -567,7 +567,7 @@
    2.58              unsafe.putShort(data + 10, (short)0); /* pad */
    2.59              unsafe.putInt(data + 12, dataSize);
    2.60  
    2.61 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    2.62 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    2.63              XlibWrapper.XChangeProperty(XToolkit.getDisplay(), window,
    2.64                                          XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
    2.65                                          XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
     3.1 --- a/src/solaris/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java	Wed May 06 20:06:23 2009 +0400
     3.2 +++ b/src/solaris/classes/sun/awt/X11/MotifDnDDragSourceProtocol.java	Fri May 15 15:40:35 2009 +0400
     3.3 @@ -184,7 +184,7 @@
     3.4                                       XConstants.AnyPropertyType);
     3.5  
     3.6          try {
     3.7 -            int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
     3.8 +            int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
     3.9  
    3.10              /*
    3.11               * DragICCI.h:
     4.1 --- a/src/solaris/classes/sun/awt/X11/MotifDnDDropTargetProtocol.java	Wed May 06 20:06:23 2009 +0400
     4.2 +++ b/src/solaris/classes/sun/awt/X11/MotifDnDDropTargetProtocol.java	Fri May 15 15:40:35 2009 +0400
     4.3 @@ -102,7 +102,7 @@
     4.4                                       XConstants.AnyPropertyType);
     4.5  
     4.6          try {
     4.7 -            status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
     4.8 +            status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
     4.9  
    4.10              /*
    4.11               * DragICCI.h:
    4.12 @@ -162,7 +162,7 @@
    4.13                  unsafe.putInt(data + 12, dataSize);
    4.14              }
    4.15  
    4.16 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    4.17 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    4.18              XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder,
    4.19                                          MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
    4.20                                          MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
    4.21 @@ -204,7 +204,7 @@
    4.22                                           XConstants.AnyPropertyType);
    4.23  
    4.24              try {
    4.25 -                status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
    4.26 +                status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    4.27  
    4.28                  /*
    4.29                   * DragICCI.h:
    4.30 @@ -236,7 +236,7 @@
    4.31  
    4.32                      unsafe.putInt(data + 4, tproxy);
    4.33  
    4.34 -                    XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    4.35 +                    XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    4.36                      XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder,
    4.37                                                  MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
    4.38                                                  MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
    4.39 @@ -276,7 +276,7 @@
    4.40                                       XConstants.AnyPropertyType);
    4.41  
    4.42          try {
    4.43 -            status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
    4.44 +            status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    4.45  
    4.46              /*
    4.47               * DragICCI.h:
    4.48 @@ -325,7 +325,7 @@
    4.49                                       XConstants.AnyPropertyType);
    4.50  
    4.51          try {
    4.52 -            int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
    4.53 +            int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    4.54  
    4.55              if (status == (int)XConstants.Success && wpg.getData() != 0 &&
    4.56                  wpg.getActualType() != 0 && wpg.getActualFormat() == 8 &&
    4.57 @@ -375,7 +375,7 @@
    4.58                                           MotifDnDConstants.XA_MOTIF_DRAG_INITIATOR_INFO.getAtom());
    4.59  
    4.60              try {
    4.61 -                int status = wpg.execute(XToolkit.IgnoreBadWindowHandler);
    4.62 +                int status = wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    4.63  
    4.64                  if (status == XConstants.Success && wpg.getData() != 0 &&
    4.65                      wpg.getActualType() ==
    4.66 @@ -412,7 +412,7 @@
    4.67           */
    4.68          XWindowAttributes wattr = new XWindowAttributes();
    4.69          try {
    4.70 -            XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
    4.71 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    4.72              int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
    4.73                                                            source_win, wattr.pData);
    4.74  
    4.75 @@ -429,7 +429,7 @@
    4.76              wattr.dispose();
    4.77          }
    4.78  
    4.79 -        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
    4.80 +        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    4.81          XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win,
    4.82                                   source_win_mask |
    4.83                                   XConstants.StructureNotifyMask);
    4.84 @@ -1020,7 +1020,7 @@
    4.85          if (sourceWindow != 0) {
    4.86              XToolkit.awtLock();
    4.87              try {
    4.88 -                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
    4.89 +                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    4.90                  XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow,
    4.91                                           sourceWindowMask);
    4.92                  XToolkit.RESTORE_XERROR_HANDLER();
     5.1 --- a/src/solaris/classes/sun/awt/X11/WindowPropertyGetter.java	Wed May 06 20:06:23 2009 +0400
     5.2 +++ b/src/solaris/classes/sun/awt/X11/WindowPropertyGetter.java	Fri May 15 15:40:35 2009 +0400
     5.3 @@ -75,7 +75,7 @@
     5.4      public int execute() {
     5.5          return execute(null);
     5.6      }
     5.7 -    public int execute(XToolkit.XErrorHandler errorHandler) {
     5.8 +    public int execute(XErrorHandler errorHandler) {
     5.9  
    5.10          XToolkit.awtLock();
    5.11          try {
    5.12 @@ -94,7 +94,7 @@
    5.13  
    5.14              // Fix for performance problem - IgnodeBadWindowHandler is
    5.15              // used too much without reason, just ignore it
    5.16 -            if (errorHandler == XToolkit.IgnoreBadWindowHandler) {
    5.17 +            if (errorHandler instanceof XErrorHandler.IgnoreBadWindowHandler) {
    5.18                  errorHandler = null;
    5.19              }
    5.20  
     6.1 --- a/src/solaris/classes/sun/awt/X11/XAWTXSettings.java	Wed May 06 20:06:23 2009 +0400
     6.2 +++ b/src/solaris/classes/sun/awt/X11/XAWTXSettings.java	Fri May 15 15:40:35 2009 +0400
     6.3 @@ -126,7 +126,7 @@
     6.4                  new WindowPropertyGetter(owner, xSettingsPropertyAtom, 0, MAX_LENGTH,
     6.5                          false, xSettingsPropertyAtom.getAtom() );
     6.6              try {
     6.7 -                int status = getter.execute(XToolkit.IgnoreBadWindowHandler);
     6.8 +                int status = getter.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
     6.9  
    6.10                  if (status != XConstants.Success || getter.getData() == 0) {
    6.11                      if (log.isLoggable(Level.FINE)) log.fine("OH OH : getter failed  status = " + status );
     7.1 --- a/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java	Wed May 06 20:06:23 2009 +0400
     7.2 +++ b/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java	Fri May 15 15:40:35 2009 +0400
     7.3 @@ -1100,7 +1100,8 @@
     7.4      }
     7.5  
     7.6      boolean isOverrideRedirect() {
     7.7 -        return false;
     7.8 +//        return false;
     7.9 +        return ((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target);
    7.10      }
    7.11  
    7.12      public boolean requestWindowFocus(long time, boolean timeProvided) {
     8.1 --- a/src/solaris/classes/sun/awt/X11/XDnDDragSourceProtocol.java	Wed May 06 20:06:23 2009 +0400
     8.2 +++ b/src/solaris/classes/sun/awt/X11/XDnDDragSourceProtocol.java	Fri May 15 15:40:35 2009 +0400
     8.3 @@ -96,7 +96,7 @@
     8.4                  action_count++;
     8.5              }
     8.6  
     8.7 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
     8.8 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
     8.9              XDnDConstants.XA_XdndActionList.setAtomData(window,
    8.10                                                          XAtom.XA_ATOM,
    8.11                                                          data, action_count);
    8.12 @@ -117,7 +117,7 @@
    8.13          try {
    8.14              Native.put(data, formats);
    8.15  
    8.16 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    8.17 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    8.18              XDnDConstants.XA_XdndTypeList.setAtomData(window,
    8.19                                                        XAtom.XA_ATOM,
    8.20                                                        data, formats.length);
    8.21 @@ -195,7 +195,7 @@
    8.22              new WindowPropertyGetter(window, XDnDConstants.XA_XdndAware, 0, 1,
    8.23                                       false, XConstants.AnyPropertyType);
    8.24  
    8.25 -        int status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
    8.26 +        int status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    8.27  
    8.28          if (status == XConstants.Success &&
    8.29              wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
    8.30 @@ -215,7 +215,7 @@
    8.31                                               0, 1, false, XAtom.XA_WINDOW);
    8.32  
    8.33                  try {
    8.34 -                    status = wpg2.execute(XToolkit.IgnoreBadWindowHandler);
    8.35 +                    status = wpg2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    8.36  
    8.37                      if (status == XConstants.Success &&
    8.38                          wpg2.getData() != 0 &&
    8.39 @@ -233,7 +233,7 @@
    8.40                                                   0, 1, false, XAtom.XA_WINDOW);
    8.41  
    8.42                      try {
    8.43 -                        status = wpg3.execute(XToolkit.IgnoreBadWindowHandler);
    8.44 +                        status = wpg3.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    8.45  
    8.46                          if (status != XConstants.Success ||
    8.47                              wpg3.getData() == 0 ||
    8.48 @@ -249,7 +249,7 @@
    8.49                                                           XConstants.AnyPropertyType);
    8.50  
    8.51                              try {
    8.52 -                                status = wpg4.execute(XToolkit.IgnoreBadWindowHandler);
    8.53 +                                status = wpg4.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    8.54  
    8.55                                  if (status != XConstants.Success ||
    8.56                                      wpg4.getData() == 0 ||
     9.1 --- a/src/solaris/classes/sun/awt/X11/XDnDDropTargetProtocol.java	Wed May 06 20:06:23 2009 +0400
     9.2 +++ b/src/solaris/classes/sun/awt/X11/XDnDDropTargetProtocol.java	Fri May 15 15:40:35 2009 +0400
     9.3 @@ -88,7 +88,7 @@
     9.4          try {
     9.5              Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION);
     9.6  
     9.7 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
     9.8 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
     9.9              XDnDConstants.XA_XdndAware.setAtomData(window, XAtom.XA_ATOM, data, 1);
    9.10              XToolkit.RESTORE_XERROR_HANDLER();
    9.11  
    9.12 @@ -122,7 +122,7 @@
    9.13                                       false, XConstants.AnyPropertyType);
    9.14  
    9.15          try {
    9.16 -            status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
    9.17 +            status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    9.18  
    9.19              if (status == XConstants.Success &&
    9.20                  wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
    9.21 @@ -141,7 +141,7 @@
    9.22                                           0, 1, false, XAtom.XA_WINDOW);
    9.23  
    9.24              try {
    9.25 -                status = wpg2.execute(XToolkit.IgnoreBadWindowHandler);
    9.26 +                status = wpg2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    9.27  
    9.28                  if (status == XConstants.Success &&
    9.29                      wpg2.getData() != 0 &&
    9.30 @@ -159,7 +159,7 @@
    9.31                                               0, 1, false, XAtom.XA_WINDOW);
    9.32  
    9.33                  try {
    9.34 -                    status = wpg3.execute(XToolkit.IgnoreBadWindowHandler);
    9.35 +                    status = wpg3.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    9.36  
    9.37                      if (status != XConstants.Success ||
    9.38                          wpg3.getData() == 0 ||
    9.39 @@ -175,7 +175,7 @@
    9.40                                                       XConstants.AnyPropertyType);
    9.41  
    9.42                          try {
    9.43 -                            status = wpg4.execute(XToolkit.IgnoreBadWindowHandler);
    9.44 +                            status = wpg4.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    9.45  
    9.46                              if (status != XConstants.Success ||
    9.47                                  wpg4.getData() == 0 ||
    9.48 @@ -205,7 +205,7 @@
    9.49  
    9.50              /* The proxy window must have the XdndAware set, as XDnD protocol
    9.51                 prescribes to check the proxy window for XdndAware. */
    9.52 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    9.53 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    9.54              XDnDConstants.XA_XdndAware.setAtomData(newProxy, XAtom.XA_ATOM,
    9.55                                                     data, 1);
    9.56              XToolkit.RESTORE_XERROR_HANDLER();
    9.57 @@ -219,7 +219,7 @@
    9.58              Native.putLong(data, 0, newProxy);
    9.59  
    9.60              /* The proxy window must have the XdndProxy set to point to itself.*/
    9.61 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    9.62 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    9.63              XDnDConstants.XA_XdndProxy.setAtomData(newProxy, XAtom.XA_WINDOW,
    9.64                                                     data, 1);
    9.65              XToolkit.RESTORE_XERROR_HANDLER();
    9.66 @@ -232,7 +232,7 @@
    9.67  
    9.68              Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION);
    9.69  
    9.70 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    9.71 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    9.72              XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM,
    9.73                                                     data, 1);
    9.74              XToolkit.RESTORE_XERROR_HANDLER();
    9.75 @@ -245,7 +245,7 @@
    9.76  
    9.77              Native.putLong(data, 0, newProxy);
    9.78  
    9.79 -            XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    9.80 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    9.81              XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW,
    9.82                                                     data, 1);
    9.83              XToolkit.RESTORE_XERROR_HANDLER();
    9.84 @@ -278,7 +278,7 @@
    9.85              try {
    9.86                  Native.putLong(data, 0, entry.getVersion());
    9.87  
    9.88 -                XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    9.89 +                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    9.90                  XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM,
    9.91                                                         data, 1);
    9.92                  XToolkit.RESTORE_XERROR_HANDLER();
    9.93 @@ -291,7 +291,7 @@
    9.94  
    9.95                  Native.putLong(data, 0, (int)entry.getProxy());
    9.96  
    9.97 -                XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
    9.98 +                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
    9.99                  XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW,
   9.100                                                         data, 1);
   9.101                  XToolkit.RESTORE_XERROR_HANDLER();
   9.102 @@ -329,7 +329,7 @@
   9.103                                       false, XConstants.AnyPropertyType);
   9.104  
   9.105          try {
   9.106 -            status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
   9.107 +            status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.108  
   9.109              if (status == XConstants.Success &&
   9.110                  wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
   9.111 @@ -348,7 +348,7 @@
   9.112                                           0, 1, false, XAtom.XA_WINDOW);
   9.113  
   9.114              try {
   9.115 -                status = wpg2.execute(XToolkit.IgnoreBadWindowHandler);
   9.116 +                status = wpg2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.117  
   9.118                  if (status == XConstants.Success &&
   9.119                      wpg2.getData() != 0 &&
   9.120 @@ -366,7 +366,7 @@
   9.121                                               0, 1, false, XAtom.XA_WINDOW);
   9.122  
   9.123                  try {
   9.124 -                    status = wpg3.execute(XToolkit.IgnoreBadWindowHandler);
   9.125 +                    status = wpg3.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.126  
   9.127                      if (status != XConstants.Success ||
   9.128                          wpg3.getData() == 0 ||
   9.129 @@ -382,7 +382,7 @@
   9.130                                                       XConstants.AnyPropertyType);
   9.131  
   9.132                          try {
   9.133 -                            status = wpg4.execute(XToolkit.IgnoreBadWindowHandler);
   9.134 +                            status = wpg4.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.135  
   9.136                              if (status != XConstants.Success ||
   9.137                                  wpg4.getData() == 0 ||
   9.138 @@ -411,7 +411,7 @@
   9.139                                       false, XConstants.AnyPropertyType);
   9.140  
   9.141          try {
   9.142 -            int status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
   9.143 +            int status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.144  
   9.145              if (status == XConstants.Success &&
   9.146                  wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
   9.147 @@ -473,7 +473,7 @@
   9.148                                           0, 0xFFFF, false,
   9.149                                           XAtom.XA_ATOM);
   9.150              try {
   9.151 -                wpg.execute(XToolkit.IgnoreBadWindowHandler);
   9.152 +                wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.153  
   9.154                  if (wpg.getActualType() == XAtom.XA_ATOM &&
   9.155                      wpg.getActualFormat() == 32) {
   9.156 @@ -505,7 +505,7 @@
   9.157                                           0, 0xFFFF, false,
   9.158                                           XAtom.XA_ATOM);
   9.159              try {
   9.160 -                wpg.execute(XToolkit.IgnoreBadWindowHandler);
   9.161 +                wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.162  
   9.163                  if (wpg.getActualType() == XAtom.XA_ATOM &&
   9.164                      wpg.getActualFormat() == 32) {
   9.165 @@ -541,7 +541,7 @@
   9.166           */
   9.167          XWindowAttributes wattr = new XWindowAttributes();
   9.168          try {
   9.169 -            XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
   9.170 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.171              int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
   9.172                                                            source_win, wattr.pData);
   9.173  
   9.174 @@ -558,7 +558,7 @@
   9.175              wattr.dispose();
   9.176          }
   9.177  
   9.178 -        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
   9.179 +        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.180          XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win,
   9.181                                   source_win_mask |
   9.182                                   XConstants.StructureNotifyMask);
   9.183 @@ -963,7 +963,7 @@
   9.184          if (sourceWindow != 0) {
   9.185              XToolkit.awtLock();
   9.186              try {
   9.187 -                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
   9.188 +                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.189                  XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow,
   9.190                                           sourceWindowMask);
   9.191                  XToolkit.RESTORE_XERROR_HANDLER();
   9.192 @@ -1104,14 +1104,14 @@
   9.193                                                   0, 0xFFFF, false,
   9.194                                                   XAtom.XA_ATOM);
   9.195                      try {
   9.196 -                        wpg.execute(XToolkit.IgnoreBadWindowHandler);
   9.197 +                        wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   9.198  
   9.199                          if (wpg.getActualType() == XAtom.XA_ATOM &&
   9.200                              wpg.getActualFormat() == 32) {
   9.201  
   9.202                              XToolkit.awtLock();
   9.203                              try {
   9.204 -                                XToolkit.WITH_XERROR_HANDLER(XWM.VerifyChangePropertyHandler);
   9.205 +                                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
   9.206                                  XDnDConstants.XA_XdndTypeList.setAtomData(xclient.get_window(),
   9.207                                                                            XAtom.XA_ATOM,
   9.208                                                                            wpg.getData(),
    10.1 --- a/src/solaris/classes/sun/awt/X11/XDragSourceProtocol.java	Wed May 06 20:06:23 2009 +0400
    10.2 +++ b/src/solaris/classes/sun/awt/X11/XDragSourceProtocol.java	Fri May 15 15:40:35 2009 +0400
    10.3 @@ -181,7 +181,7 @@
    10.4                                     long time) {
    10.5          XWindowAttributes wattr = new XWindowAttributes();
    10.6          try {
    10.7 -            XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
    10.8 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    10.9              int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
   10.10                                                            targetWindow, wattr.pData);
   10.11  
   10.12 @@ -198,7 +198,7 @@
   10.13              wattr.dispose();
   10.14          }
   10.15  
   10.16 -        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
   10.17 +        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   10.18          XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow,
   10.19                                   targetWindowMask |
   10.20                                   XConstants.StructureNotifyMask);
   10.21 @@ -214,7 +214,7 @@
   10.22      }
   10.23  
   10.24      protected final void finalizeDrop() {
   10.25 -        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
   10.26 +        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   10.27          XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow,
   10.28                                   targetWindowMask);
   10.29          XToolkit.RESTORE_XERROR_HANDLER();
    11.1 --- a/src/solaris/classes/sun/awt/X11/XDropTargetRegistry.java	Wed May 06 20:06:23 2009 +0400
    11.2 +++ b/src/solaris/classes/sun/awt/X11/XDropTargetRegistry.java	Fri May 15 15:40:35 2009 +0400
    11.3 @@ -168,7 +168,7 @@
    11.4                  if (dest_x >= 0 && dest_y >= 0) {
    11.5                      XWindowAttributes wattr = new XWindowAttributes();
    11.6                      try {
    11.7 -                        XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
    11.8 +                        XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    11.9                          int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
   11.10                                                                        window, wattr.pData);
   11.11                          XToolkit.RESTORE_XERROR_HANDLER();
   11.12 @@ -222,7 +222,7 @@
   11.13              long event_mask = 0;
   11.14              XWindowAttributes wattr = new XWindowAttributes();
   11.15              try {
   11.16 -                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
   11.17 +                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   11.18                  int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
   11.19                                                                embedder, wattr.pData);
   11.20                  XToolkit.RESTORE_XERROR_HANDLER();
   11.21 @@ -240,7 +240,7 @@
   11.22              }
   11.23  
   11.24              if ((event_mask & XConstants.PropertyChangeMask) == 0) {
   11.25 -                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
   11.26 +                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   11.27                  XlibWrapper.XSelectInput(XToolkit.getDisplay(), embedder,
   11.28                                           event_mask | XConstants.PropertyChangeMask);
   11.29                  XToolkit.RESTORE_XERROR_HANDLER();
   11.30 @@ -394,7 +394,7 @@
   11.31  
   11.32              /* Restore the original event mask for the embedder. */
   11.33              if ((event_mask & XConstants.PropertyChangeMask) == 0) {
   11.34 -                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
   11.35 +                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   11.36                  XlibWrapper.XSelectInput(XToolkit.getDisplay(), embedder,
   11.37                                           event_mask);
   11.38                  XToolkit.RESTORE_XERROR_HANDLER();
    12.1 --- a/src/solaris/classes/sun/awt/X11/XEmbedCanvasPeer.java	Wed May 06 20:06:23 2009 +0400
    12.2 +++ b/src/solaris/classes/sun/awt/X11/XEmbedCanvasPeer.java	Fri May 15 15:40:35 2009 +0400
    12.3 @@ -301,7 +301,7 @@
    12.4          try {
    12.5              XWindowAttributes wattr = new XWindowAttributes();
    12.6              try {
    12.7 -                XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
    12.8 +                XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    12.9                  int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
   12.10                                                                xembed.handle, wattr.pData);
   12.11  
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/src/solaris/classes/sun/awt/X11/XErrorHandler.java	Fri May 15 15:40:35 2009 +0400
    13.3 @@ -0,0 +1,79 @@
    13.4 +/*
    13.5 + * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
    13.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    13.7 + *
    13.8 + * This code is free software; you can redistribute it and/or modify it
    13.9 + * under the terms of the GNU General Public License version 2 only, as
   13.10 + * published by the Free Software Foundation.  Sun designates this
   13.11 + * particular file as subject to the "Classpath" exception as provided
   13.12 + * by Sun in the LICENSE file that accompanied this code.
   13.13 + *
   13.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   13.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   13.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   13.17 + * version 2 for more details (a copy is included in the LICENSE file that
   13.18 + * accompanied this code).
   13.19 + *
   13.20 + * You should have received a copy of the GNU General Public License version
   13.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   13.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   13.23 + *
   13.24 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   13.25 + * CA 95054 USA or visit www.sun.com if you need additional information or
   13.26 + * have any questions.
   13.27 + */
   13.28 +package sun.awt.X11;
   13.29 +
   13.30 +public abstract class XErrorHandler {
   13.31 +
   13.32 +    /*
   13.33 +     * Called under AWT lock
   13.34 +     */
   13.35 +    public abstract int handleError(long display, XErrorEvent err);
   13.36 +
   13.37 +    /*
   13.38 +     * Forwards all the errors to saved error handler (which was
   13.39 +     * set before XToolkit had been initialized).
   13.40 +     */
   13.41 +    public static class XBaseErrorHandler extends XErrorHandler {
   13.42 +        @Override
   13.43 +        public int handleError(long display, XErrorEvent err) {
   13.44 +            return XToolkit.SAVED_ERROR_HANDLER(display, err);
   13.45 +        }
   13.46 +    }
   13.47 +
   13.48 +    /*
   13.49 +     * Instead of validating window id, we simply call XGetWindowProperty,
   13.50 +     * but temporary install this function as the error handler to ignore
   13.51 +     * BadWindow error.
   13.52 +     */
   13.53 +    public static class IgnoreBadWindowHandler extends XBaseErrorHandler {
   13.54 +        @Override
   13.55 +        public int handleError(long display, XErrorEvent err) {
   13.56 +            if (err.get_error_code() == XConstants.BadWindow) {
   13.57 +                return 0;
   13.58 +            }
   13.59 +            return super.handleError(display, err);
   13.60 +        }
   13.61 +        // Shared instance
   13.62 +        private static IgnoreBadWindowHandler theInstance = new IgnoreBadWindowHandler();
   13.63 +        public static IgnoreBadWindowHandler getInstance() {
   13.64 +            return theInstance;
   13.65 +        }
   13.66 +    }
   13.67 +
   13.68 +    public static class VerifyChangePropertyHandler extends XBaseErrorHandler {
   13.69 +        @Override
   13.70 +        public int handleError(long display, XErrorEvent err) {
   13.71 +            if (err.get_request_code() == XProtocolConstants.X_ChangeProperty) {
   13.72 +                return 0;
   13.73 +            }
   13.74 +            return super.handleError(display, err);
   13.75 +        }
   13.76 +        // Shared instance
   13.77 +        private static IgnoreBadWindowHandler theInstance = new IgnoreBadWindowHandler();
   13.78 +        public static IgnoreBadWindowHandler getInstance() {
   13.79 +            return theInstance;
   13.80 +        }
   13.81 +    }
   13.82 +}
    14.1 --- a/src/solaris/classes/sun/awt/X11/XProtocol.java	Wed May 06 20:06:23 2009 +0400
    14.2 +++ b/src/solaris/classes/sun/awt/X11/XProtocol.java	Fri May 15 15:40:35 2009 +0400
    14.3 @@ -35,20 +35,6 @@
    14.4      private Map<XAtom, XAtomList> atomToList = new HashMap<XAtom, XAtomList>();
    14.5      private Map<XAtom, Long> atomToAnchor = new HashMap<XAtom, Long>();
    14.6  
    14.7 -    /*
    14.8 -     * Temporary error handler that ensures that we know if
    14.9 -     * XChangeProperty succeeded or not.
   14.10 -     */
   14.11 -    static XToolkit.XErrorHandler VerifyChangePropertyHandler = new XToolkit.XErrorHandler() {
   14.12 -            public int handleError(long display, XErrorEvent err) {
   14.13 -                XToolkit.XERROR_SAVE(err);
   14.14 -                if (err.get_request_code() == XProtocolConstants.X_ChangeProperty) {
   14.15 -                    return 0;
   14.16 -                } else {
   14.17 -                    return XToolkit.SAVED_ERROR_HANDLER(display, err);
   14.18 -                }
   14.19 -            }
   14.20 -        };
   14.21      volatile boolean firstCheck = true;
   14.22      /*
   14.23       * Check that that the list of protocols specified by WM in property
    15.1 --- a/src/solaris/classes/sun/awt/X11/XQueryTree.java	Wed May 06 20:06:23 2009 +0400
    15.2 +++ b/src/solaris/classes/sun/awt/X11/XQueryTree.java	Fri May 15 15:40:35 2009 +0400
    15.3 @@ -52,7 +52,7 @@
    15.4          public int execute() {
    15.5                  return execute(null);
    15.6          }
    15.7 -        public int execute(XToolkit.XErrorHandler errorHandler) {
    15.8 +        public int execute(XErrorHandler errorHandler) {
    15.9                  XToolkit.awtLock();
   15.10                  try {
   15.11                      if (isDisposed()) {
    16.1 --- a/src/solaris/classes/sun/awt/X11/XToolkit.java	Wed May 06 20:06:23 2009 +0400
    16.2 +++ b/src/solaris/classes/sun/awt/X11/XToolkit.java	Fri May 15 15:40:35 2009 +0400
    16.3 @@ -149,63 +149,78 @@
    16.4              setBackingStoreType();
    16.5          }
    16.6          m_removeSourceEvents = SunToolkit.getMethod(EventQueue.class, "removeSourceEvents", new Class[] {Object.class, Boolean.TYPE}) ;
    16.7 +
    16.8 +        noisyAwtHandler = AccessController.doPrivileged(new GetBooleanAction("sun.awt.noisyerrorhandler"));
    16.9      }
   16.10  
   16.11 -    // Error handler stuff
   16.12 -    static XErrorEvent saved_error;
   16.13 -    static long saved_error_handler;
   16.14 -    static XErrorHandler curErrorHandler;
   16.15 -    // Should be called under LOCK, before releasing LOCK RESTORE_XERROR_HANDLER should be called
   16.16 -    static void WITH_XERROR_HANDLER(XErrorHandler handler) {
   16.17 +    //---- ERROR HANDLER CODE ----//
   16.18 +
   16.19 +    /*
   16.20 +     * Error handler at the moment of XToolkit initialization
   16.21 +     */
   16.22 +    private static long saved_error_handler;
   16.23 +
   16.24 +    /*
   16.25 +     * XErrorEvent being handled
   16.26 +     */
   16.27 +    static volatile XErrorEvent saved_error;
   16.28 +
   16.29 +    /*
   16.30 +     * Current error handler or null if no error handler is set
   16.31 +     */
   16.32 +    private static XErrorHandler current_error_handler;
   16.33 +
   16.34 +    /*
   16.35 +     * Value of sun.awt.noisyerrorhandler system property
   16.36 +     */
   16.37 +    private static boolean noisyAwtHandler;
   16.38 +
   16.39 +    public static void WITH_XERROR_HANDLER(XErrorHandler handler) {
   16.40          saved_error = null;
   16.41 -        curErrorHandler = handler;
   16.42 -        XSync();
   16.43 -        saved_error_handler = XlibWrapper.SetToolkitErrorHandler();
   16.44 +        current_error_handler = handler;
   16.45      }
   16.46 -    static void XERROR_SAVE(XErrorEvent event) {
   16.47 +
   16.48 +    public static void RESTORE_XERROR_HANDLER() {
   16.49 +        current_error_handler = null;
   16.50 +    }
   16.51 +
   16.52 +    // Should be called under LOCK
   16.53 +    public static int SAVED_ERROR_HANDLER(long display, XErrorEvent error) {
   16.54 +        if (saved_error_handler != 0) {
   16.55 +            // Default XErrorHandler may just terminate the process. Don't call it.
   16.56 +            // return XlibWrapper.CallErrorHandler(saved_error_handler, display, error.pData);
   16.57 +        }
   16.58 +        if (log.isLoggable(Level.FINE)) {
   16.59 +            log.log(Level.FINE, "Unhandled XErrorEvent: " +
   16.60 +                    "id=" + error.get_resourceid() + ", " +
   16.61 +                    "serial=" + error.get_serial() + ", " +
   16.62 +                    "ec=" + error.get_error_code() + ", " +
   16.63 +                    "rc=" + error.get_request_code() + ", " +
   16.64 +                    "mc=" + error.get_minor_code());
   16.65 +        }
   16.66 +        return 0;
   16.67 +    }
   16.68 +
   16.69 +    // Called from the native code when an error occurs
   16.70 +    private static int globalErrorHandler(long display, long event_ptr) {
   16.71 +        if (noisyAwtHandler) {
   16.72 +            XlibWrapper.PrintXErrorEvent(display, event_ptr);
   16.73 +        }
   16.74 +        XErrorEvent event = new XErrorEvent(event_ptr);
   16.75          saved_error = event;
   16.76 -    }
   16.77 -    // Should be called under LOCK
   16.78 -    static void RESTORE_XERROR_HANDLER() {
   16.79 -       XSync();
   16.80 -        XlibWrapper.XSetErrorHandler(saved_error_handler);
   16.81 -        curErrorHandler = null;
   16.82 -    }
   16.83 -    // Should be called under LOCK
   16.84 -    static int SAVED_ERROR_HANDLER(long display, XErrorEvent error) {
   16.85 -        return XlibWrapper.CallErrorHandler(saved_error_handler, display, error.pData);
   16.86 -    }
   16.87 -    interface XErrorHandler {
   16.88 -        int handleError(long display, XErrorEvent err);
   16.89 -    }
   16.90 -    static int GlobalErrorHandler(long display, long event_ptr) {
   16.91 -        XErrorEvent event = new XErrorEvent(event_ptr);
   16.92          try {
   16.93 -            if (curErrorHandler != null) {
   16.94 -                return curErrorHandler.handleError(display, event);
   16.95 +            if (current_error_handler != null) {
   16.96 +                return current_error_handler.handleError(display, event);
   16.97              } else {
   16.98                  return SAVED_ERROR_HANDLER(display, event);
   16.99              }
  16.100 -        } finally {
  16.101 +        } catch (Throwable z) {
  16.102 +            log.log(Level.FINE, "Error in GlobalErrorHandler", z);
  16.103          }
  16.104 +        return 0;
  16.105      }
  16.106  
  16.107 -/*
  16.108 - * Instead of validating window id, we simply call XGetWindowProperty,
  16.109 - * but temporary install this function as the error handler to ignore
  16.110 - * BadWindow error.
  16.111 - */
  16.112 -    static XErrorHandler IgnoreBadWindowHandler = new XErrorHandler() {
  16.113 -            public int handleError(long display, XErrorEvent err) {
  16.114 -                XERROR_SAVE(err);
  16.115 -                if (err.get_error_code() == XConstants.BadWindow) {
  16.116 -                    return 0;
  16.117 -                } else {
  16.118 -                    return SAVED_ERROR_HANDLER(display, err);
  16.119 -                }
  16.120 -            }
  16.121 -        };
  16.122 -
  16.123 +    //---- END OF ERROR HANDLER CODE ----//
  16.124  
  16.125      private native static void initIDs();
  16.126      native static void waitForEvents(long nextTaskTime);
  16.127 @@ -302,25 +317,34 @@
  16.128              areExtraMouseButtonsEnabled = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons", "true"));
  16.129              //set system property if not yet assigned
  16.130              System.setProperty("sun.awt.enableExtraMouseButtons", ""+areExtraMouseButtonsEnabled);
  16.131 +
  16.132 +            saved_error_handler = XlibWrapper.SetToolkitErrorHandler();
  16.133          } finally {
  16.134              awtUnlock();
  16.135          }
  16.136  
  16.137          Runtime.getRuntime().addShutdownHook(new Thread() {
  16.138 -                public void run() {
  16.139 -                    XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance();
  16.140 -                    if (peer != null) {
  16.141 -                        peer.dispose();
  16.142 -                    }
  16.143 -                    if (xs != null) {
  16.144 -                        ((XAWTXSettings)xs).dispose();
  16.145 -                    }
  16.146 -                    freeXKB();
  16.147 -                    if (log.isLoggable(Level.FINE)) {
  16.148 -                        dumpPeers();
  16.149 -                    }
  16.150 +            public void run() {
  16.151 +                XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance();
  16.152 +                if (peer != null) {
  16.153 +                    peer.dispose();
  16.154                  }
  16.155 -            });
  16.156 +                if (xs != null) {
  16.157 +                    ((XAWTXSettings)xs).dispose();
  16.158 +                }
  16.159 +                freeXKB();
  16.160 +                if (log.isLoggable(Level.FINE)) {
  16.161 +                    dumpPeers();
  16.162 +                }
  16.163 +
  16.164 +                awtLock();
  16.165 +                try {
  16.166 +                    XlibWrapper.XSetErrorHandler(saved_error_handler);
  16.167 +                } finally {
  16.168 +                    awtUnlock();
  16.169 +                }
  16.170 +            }
  16.171 +        });
  16.172      }
  16.173  
  16.174      static String getCorrectXIDString(String val) {
  16.175 @@ -2409,8 +2433,6 @@
  16.176          return new XDesktopPeer();
  16.177      }
  16.178  
  16.179 -    public static native void setNoisyXErrorHandler();
  16.180 -
  16.181      public boolean areExtraMouseButtonsEnabled() throws HeadlessException {
  16.182          return areExtraMouseButtonsEnabled;
  16.183      }
    17.1 --- a/src/solaris/classes/sun/awt/X11/XTranslateCoordinates.java	Wed May 06 20:06:23 2009 +0400
    17.2 +++ b/src/solaris/classes/sun/awt/X11/XTranslateCoordinates.java	Fri May 15 15:40:35 2009 +0400
    17.3 @@ -57,7 +57,7 @@
    17.4          public int execute() {
    17.5                  return execute(null);
    17.6          }
    17.7 -        public int execute(XToolkit.XErrorHandler errorHandler) {
    17.8 +        public int execute(XErrorHandler errorHandler) {
    17.9                  XToolkit.awtLock();
   17.10                  try {
   17.11                  if (isDisposed()) {
    18.1 --- a/src/solaris/classes/sun/awt/X11/XWM.java	Wed May 06 20:06:23 2009 +0400
    18.2 +++ b/src/solaris/classes/sun/awt/X11/XWM.java	Fri May 15 15:40:35 2009 +0400
    18.3 @@ -276,7 +276,7 @@
    18.4              winmgr_running = false;
    18.5              substruct.set_event_mask(XConstants.SubstructureRedirectMask);
    18.6  
    18.7 -            XToolkit.WITH_XERROR_HANDLER(DetectWMHandler);
    18.8 +            XToolkit.WITH_XERROR_HANDLER(detectWMHandler);
    18.9              XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(),
   18.10                                                  XToolkit.getDefaultRootWindow(),
   18.11                                                  XConstants.CWEventMask,
   18.12 @@ -321,7 +321,7 @@
   18.13              new WindowPropertyGetter(window, XA_ENLIGHTENMENT_COMMS, 0, 14, false,
   18.14                                       XAtom.XA_STRING);
   18.15          try {
   18.16 -            int status = getter.execute(XToolkit.IgnoreBadWindowHandler);
   18.17 +            int status = getter.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   18.18              if (status != XConstants.Success || getter.getData() == 0) {
   18.19                  return 0;
   18.20              }
   18.21 @@ -439,7 +439,7 @@
   18.22                  new WindowPropertyGetter(wmwin, XA_DT_SM_STATE_INFO, 0, 1,
   18.23                                           false, XA_DT_SM_STATE_INFO);
   18.24              try {
   18.25 -                status = getter2.execute(XToolkit.IgnoreBadWindowHandler);
   18.26 +                status = getter2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   18.27  
   18.28  
   18.29                  if (status != XConstants.Success || getter2.getData() == 0) {
   18.30 @@ -571,21 +571,6 @@
   18.31      }
   18.32  
   18.33      /*
   18.34 -     * Temporary error handler that ensures that we know if
   18.35 -     * XChangeProperty succeeded or not.
   18.36 -     */
   18.37 -    static XToolkit.XErrorHandler VerifyChangePropertyHandler = new XToolkit.XErrorHandler() {
   18.38 -            public int handleError(long display, XErrorEvent err) {
   18.39 -                XToolkit.XERROR_SAVE(err);
   18.40 -                if (err.get_request_code() == XProtocolConstants.X_ChangeProperty) {
   18.41 -                    return 0;
   18.42 -                } else {
   18.43 -                    return XToolkit.SAVED_ERROR_HANDLER(display, err);
   18.44 -                }
   18.45 -            }
   18.46 -        };
   18.47 -
   18.48 -    /*
   18.49       * Prepare IceWM check.
   18.50       *
   18.51       * The only way to detect IceWM, seems to be by setting
   18.52 @@ -617,7 +602,7 @@
   18.53  
   18.54          XToolkit.awtLock();
   18.55          try {
   18.56 -            XToolkit.WITH_XERROR_HANDLER(VerifyChangePropertyHandler);
   18.57 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
   18.58              XlibWrapper.XChangePropertyS(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(),
   18.59                                           XA_ICEWM_WINOPTHINT.getAtom(),
   18.60                                           XA_ICEWM_WINOPTHINT.getAtom(),
   18.61 @@ -682,20 +667,19 @@
   18.62       * Temporary error handler that checks if selecting for
   18.63       * SubstructureRedirect failed.
   18.64       */
   18.65 -    static boolean winmgr_running = false;
   18.66 -    static XToolkit.XErrorHandler DetectWMHandler = new XToolkit.XErrorHandler() {
   18.67 -            public int handleError(long display, XErrorEvent err) {
   18.68 -                XToolkit.XERROR_SAVE(err);
   18.69 -                if (err.get_request_code() == XProtocolConstants.X_ChangeWindowAttributes
   18.70 -                    && err.get_error_code() == XConstants.BadAccess)
   18.71 -                {
   18.72 -                    winmgr_running = true;
   18.73 -                    return 0;
   18.74 -                } else {
   18.75 -                    return XToolkit.SAVED_ERROR_HANDLER(display, err);
   18.76 -                }
   18.77 +    private static boolean winmgr_running = false;
   18.78 +    private static XErrorHandler detectWMHandler = new XErrorHandler.XBaseErrorHandler() {
   18.79 +        @Override
   18.80 +        public int handleError(long display, XErrorEvent err) {
   18.81 +            if ((err.get_request_code() == XProtocolConstants.X_ChangeWindowAttributes) &&
   18.82 +                (err.get_error_code() == XConstants.BadAccess))
   18.83 +            {
   18.84 +                winmgr_running = true;
   18.85 +                return 0;
   18.86              }
   18.87 -        };
   18.88 +            return super.handleError(display, err);
   18.89 +        }
   18.90 +    };
   18.91  
   18.92      /*
   18.93       * Make an educated guess about running window manager.
    19.1 --- a/src/solaris/classes/sun/awt/X11/XlibUtil.java	Wed May 06 20:06:23 2009 +0400
    19.2 +++ b/src/solaris/classes/sun/awt/X11/XlibUtil.java	Fri May 15 15:40:35 2009 +0400
    19.3 @@ -149,7 +149,7 @@
    19.4                  new XTranslateCoordinates(src, dst, p.x, p.y);
    19.5              try
    19.6              {
    19.7 -                int status = xtc.execute(XToolkit.IgnoreBadWindowHandler);
    19.8 +                int status = xtc.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
    19.9                  if ((status != 0) &&
   19.10                      ((XToolkit.saved_error == null) ||
   19.11                       (XToolkit.saved_error.get_error_code() == XConstants.Success)))
   19.12 @@ -306,7 +306,7 @@
   19.13                                           XWM.XA_WM_STATE);
   19.14              try
   19.15              {
   19.16 -                wpg.execute(XToolkit.IgnoreBadWindowHandler);
   19.17 +                wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   19.18                  if (wpg.getActualType() == XWM.XA_WM_STATE.getAtom())
   19.19                  {
   19.20                      return true;
   19.21 @@ -345,7 +345,7 @@
   19.22          XWindowAttributes wattr = new XWindowAttributes();
   19.23          try
   19.24          {
   19.25 -            XToolkit.WITH_XERROR_HANDLER(XToolkit.IgnoreBadWindowHandler);
   19.26 +            XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
   19.27              int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
   19.28                                                            window, wattr.pData);
   19.29              XToolkit.RESTORE_XERROR_HANDLER();
    20.1 --- a/src/solaris/classes/sun/awt/X11/XlibWrapper.java	Wed May 06 20:06:23 2009 +0400
    20.2 +++ b/src/solaris/classes/sun/awt/X11/XlibWrapper.java	Fri May 15 15:40:35 2009 +0400
    20.3 @@ -646,4 +646,6 @@
    20.4          String javaVersion = XToolkit.getSystemProperty("java.version");
    20.5          return javaVersion != null && javaVersion.contains("internal");
    20.6      }
    20.7 +
    20.8 +    static native void PrintXErrorEvent(long display, long event_ptr);
    20.9  }
    21.1 --- a/src/solaris/native/sun/awt/awt_GraphicsEnv.c	Wed May 06 20:06:23 2009 +0400
    21.2 +++ b/src/solaris/native/sun/awt/awt_GraphicsEnv.c	Fri May 15 15:40:35 2009 +0400
    21.3 @@ -175,42 +175,11 @@
    21.4  }
    21.5  
    21.6  #ifndef HEADLESS
    21.7 +
    21.8  /*
    21.9 - * error handlers
   21.10 + * XIOErrorHandler
   21.11   */
   21.12 -
   21.13 -int
   21.14 -xerror_handler(Display * disp, XErrorEvent * err)
   21.15 -{
   21.16 -/* #ifdef DEBUG */
   21.17 -    char msg[128];
   21.18 -    char buf[128];
   21.19 -    char *ev = getenv("NOISY_AWT");
   21.20 -
   21.21 -    if (!ev || !ev[0])
   21.22 -        return 0;
   21.23 -    XGetErrorText(disp, err->error_code, msg, sizeof(msg));
   21.24 -    jio_fprintf(stderr, "Xerror %s, XID %x, ser# %d\n", msg, err->resourceid, err->serial);
   21.25 -    jio_snprintf(buf, sizeof(buf), "%d", err->request_code);
   21.26 -    XGetErrorDatabaseText(disp, "XRequest", buf, "Unknown", msg, sizeof(msg));
   21.27 -    jio_fprintf(stderr, "Major opcode %d (%s)\n", err->request_code, msg);
   21.28 -    if (err->request_code > 128) {
   21.29 -        jio_fprintf(stderr, "Minor opcode %d\n", err->minor_code);
   21.30 -    }
   21.31 -    if (awtLockInited) {
   21.32 -        /*SignalError(lockedee->lastpc, lockedee, "fp/ade/gui/GUIException", msg); */
   21.33 -    }
   21.34 -    if (strcasecmp(ev, "abort") == 0) {
   21.35 -        JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
   21.36 -
   21.37 -        (*env)->FatalError(env, "xerror_handler abort");
   21.38 -    }
   21.39 -/* #endif */
   21.40 -    return 0;
   21.41 -}
   21.42 -
   21.43 -static int
   21.44 -xioerror_handler(Display * disp)
   21.45 +static int xioerror_handler(Display *disp)
   21.46  {
   21.47      if (awtLockInited) {
   21.48          if (errno == EPIPE) {
   21.49 @@ -886,7 +855,6 @@
   21.50          return NULL;
   21.51      }
   21.52  
   21.53 -    XSetErrorHandler(xerror_handler);
   21.54      XSetIOErrorHandler(xioerror_handler);
   21.55  
   21.56      /* set awt_numScreens, and whether or not we're using Xinerama */
    22.1 --- a/src/solaris/native/sun/awt/awt_InputMethod.c	Wed May 06 20:06:23 2009 +0400
    22.2 +++ b/src/solaris/native/sun/awt/awt_InputMethod.c	Fri May 15 15:40:35 2009 +0400
    22.3 @@ -1458,7 +1458,6 @@
    22.4  }
    22.5  
    22.6  static void OpenXIMCallback(Display *display, XPointer client_data, XPointer call_data) {
    22.7 -    extern int xerror_handler();
    22.8      XIMCallback ximCallback;
    22.9  
   22.10      X11im = XOpenIM(display, NULL, NULL, NULL);
   22.11 @@ -1469,13 +1468,6 @@
   22.12      ximCallback.callback = (XIMProc)DestroyXIMCallback;
   22.13      ximCallback.client_data = NULL;
   22.14      XSetIMValues(X11im, XNDestroyCallback, &ximCallback, NULL);
   22.15 -
   22.16 -    /* Workaround for Solaris 2.6 bug 4097754. We're affected by this problem
   22.17 -     * because Motif also calls XOpenIM for us. Re-registering the error handler
   22.18 -     * that MToolkit has registered already after calling XOpenIM avoids the
   22.19 -     * problem.
   22.20 -     */
   22.21 -    XSetErrorHandler(xerror_handler);
   22.22  }
   22.23  
   22.24  static void DestroyXIMCallback(XIM im, XPointer client_data, XPointer call_data) {
    23.1 --- a/src/solaris/native/sun/awt/awt_MToolkit.c	Wed May 06 20:06:23 2009 +0400
    23.2 +++ b/src/solaris/native/sun/awt/awt_MToolkit.c	Fri May 15 15:40:35 2009 +0400
    23.3 @@ -1926,26 +1926,6 @@
    23.4                XtAppProcessEvent(awt_appContext, iMask & ~XtIMXEvent);
    23.5              }
    23.6  
    23.7 -            /*
    23.8 -            ** Bug #4361799: Forte4J sometimes crashes on Solaris:
    23.9 -            ** There is an underlying bug in Selection.c in Xt lib.
   23.10 -            ** The routine HandleSelectionEvents, can call EndProtectedSection()
   23.11 -            ** more than  StartProtectedSection(), and then EndProtectedSection
   23.12 -            ** will restore the default XError handler.  As a result awt's
   23.13 -            ** XError handler gets removed and we later crash on an XError.
   23.14 -            **
   23.15 -            ** This happens when we call XtAppProcessEvent with event type 1e
   23.16 -            ** (SelectionRequest) when running two copies of Forte
   23.17 -            **
   23.18 -            ** XSetErrorHandler can safely be called repeatedly, so we are
   23.19 -            ** fixing this with the sledgehammer, and resetting our XError
   23.20 -            ** handler every time through the loop:
   23.21 -            */
   23.22 -            {
   23.23 -                extern int32_t xerror_handler();
   23.24 -                XSetErrorHandler(xerror_handler);
   23.25 -            }
   23.26 -
   23.27  } /* processOneEvent() */
   23.28  
   23.29  /*
    24.1 --- a/src/solaris/native/sun/xawt/XToolkit.c	Wed May 06 20:06:23 2009 +0400
    24.2 +++ b/src/solaris/native/sun/xawt/XToolkit.c	Fri May 15 15:40:35 2009 +0400
    24.3 @@ -575,7 +575,6 @@
    24.4          pollFds[1].revents = 0;
    24.5      }
    24.6  
    24.7 -
    24.8      AWT_NOFLUSH_UNLOCK();
    24.9  
   24.10      /* ACTUALLY DO THE POLL() */
   24.11 @@ -684,8 +683,6 @@
   24.12      return ret;
   24.13  }
   24.14  
   24.15 -static XErrorHandler saved_error_handler = NULL;
   24.16 -
   24.17  #ifdef __linux__
   24.18  void print_stack(void)
   24.19  {
   24.20 @@ -706,38 +703,6 @@
   24.21  }
   24.22  #endif
   24.23  
   24.24 -static int NoisyXErrorHandler(Display * dpy, XErrorEvent * event) {
   24.25 -    fprintf(stderr, "id=%x, serial=%x, ec=%d, rc=%d, mc=%d\n",
   24.26 -            event->resourceid, event->serial, event->error_code,
   24.27 -            event->request_code, event->minor_code);
   24.28 -    /*
   24.29 -    #ifdef __linux__
   24.30 -        print_stack();
   24.31 -    #endif
   24.32 -    */
   24.33 -    if (jvm != NULL) {
   24.34 -      JNIEnv * env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
   24.35 -      JNU_CallStaticMethodByName(env, NULL, "java/lang/Thread", "dumpStack", "()V");
   24.36 -    }
   24.37 -    if (!saved_error_handler) {
   24.38 -        return saved_error_handler(dpy, event);
   24.39 -    }
   24.40 -    return 0;
   24.41 -}
   24.42 -
   24.43 -/*
   24.44 - * Class:     sun_awt_X11_XToolkit
   24.45 - * Method:    setNoisyXErrorHandler
   24.46 - * Signature: ()V
   24.47 - */
   24.48 -JNIEXPORT void JNICALL Java_sun_awt_X11_XToolkit_setNoisyXErrorHandler
   24.49 -(JNIEnv *env , jclass clazz)
   24.50 -{
   24.51 -    (*env)->GetJavaVM(env, &jvm);
   24.52 -    saved_error_handler = XSetErrorHandler(NoisyXErrorHandler);
   24.53 -}
   24.54 -
   24.55 -
   24.56  Window get_xawt_root_shell(JNIEnv *env) {
   24.57    static jclass classXRootWindow = NULL;
   24.58    static jmethodID methodGetXRootWindow = NULL;
    25.1 --- a/src/solaris/native/sun/xawt/XlibWrapper.c	Wed May 06 20:06:23 2009 +0400
    25.2 +++ b/src/solaris/native/sun/xawt/XlibWrapper.c	Fri May 15 15:40:35 2009 +0400
    25.3 @@ -1186,7 +1186,7 @@
    25.4  static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
    25.5      if (jvm != NULL) {
    25.6          JNIEnv * env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
    25.7 -        return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", "GlobalErrorHandler", "(JJ)I",
    25.8 +        return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", "globalErrorHandler", "(JJ)I",
    25.9                                            ptr_to_jlong(dpy), ptr_to_jlong(event)).i;
   25.10      } else {
   25.11          return 0;
   25.12 @@ -1229,6 +1229,28 @@
   25.13      return (*(XErrorHandler)jlong_to_ptr(handler))((Display*) jlong_to_ptr(display), (XErrorEvent*) jlong_to_ptr(event_ptr));
   25.14  }
   25.15  
   25.16 +/*
   25.17 + * Class:     sun_awt_X11_XlibWrapper
   25.18 + * Method:    PrintXErrorEvent
   25.19 + * Signature: (JJ)V
   25.20 + */
   25.21 +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_PrintXErrorEvent
   25.22 +(JNIEnv *env, jclass clazz, jlong display, jlong event_ptr)
   25.23 +{
   25.24 +    char msg[128];
   25.25 +    char buf[128];
   25.26 +
   25.27 +    XErrorEvent* err = (XErrorEvent *)jlong_to_ptr(event_ptr);
   25.28 +
   25.29 +    XGetErrorText((Display *)jlong_to_ptr(display), err->error_code, msg, sizeof(msg));
   25.30 +    jio_fprintf(stderr, "Xerror %s, XID %x, ser# %d\n", msg, err->resourceid, err->serial);
   25.31 +    jio_snprintf(buf, sizeof(buf), "%d", err->request_code);
   25.32 +    XGetErrorDatabaseText((Display *)jlong_to_ptr(display), "XRequest", buf, "Unknown", msg, sizeof(msg));
   25.33 +    jio_fprintf(stderr, "Major opcode %d (%s)\n", err->request_code, msg);
   25.34 +    if (err->request_code > 128) {
   25.35 +        jio_fprintf(stderr, "Minor opcode %d\n", err->minor_code);
   25.36 +    }
   25.37 +}
   25.38  
   25.39  
   25.40  /*