src/solaris/native/sun/awt/awt_GraphicsEnv.c

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -756,10 +756,12 @@
         JNU_ThrowByName(env, "java/awt/AWTError", errmsg);
         return NULL;
     }
 
     XSetIOErrorHandler(xioerror_handler);
+    JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", "init", "(J)V",
+        ptr_to_jlong(awt_display));
 
     /* set awt_numScreens, and whether or not we're using Xinerama */
     xineramaInit();
 
     if (!usingXinerama) {

@@ -902,27 +904,10 @@
 
 #ifdef MITSHM
 
 static jint canUseShmExt = UNSET_MITSHM;
 static jint canUseShmExtPixmaps = UNSET_MITSHM;
-static jboolean xshmAttachFailed = JNI_FALSE;
-
-int J2DXErrHandler(Display *display, XErrorEvent *xerr) {
-    int ret = 0;
-    if (xerr->minor_code == X_ShmAttach) {
-        xshmAttachFailed = JNI_TRUE;
-    } else {
-        ret = (*xerror_saved_handler)(display, xerr);
-    }
-    return ret;
-}
-jboolean isXShmAttachFailed() {
-    return xshmAttachFailed;
-}
-void resetXShmAttachFailed() {
-    xshmAttachFailed = JNI_FALSE;
-}
 
 void TryInitMITShm(JNIEnv *env, jint *shmExt, jint *shmPixmaps) {
     XShmSegmentInfo shminfo;
     int XShmMajor, XShmMinor;
     int a, b, c;

@@ -961,25 +946,28 @@
                            strerror(errno));
             return;
         }
         shminfo.readOnly = True;
 
-        resetXShmAttachFailed();
         /**
-         * The J2DXErrHandler handler will set xshmAttachFailed
-         * to JNI_TRUE if any Shm error has occured.
+         * XShmAttachHandler will set its internal flag to JNI_TRUE, if any Shm error occurs.
          */
-        EXEC_WITH_XERROR_HANDLER(J2DXErrHandler,
-                                 XShmAttach(awt_display, &shminfo));
+        jobject xShmAttachHandler = JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandler$XShmAttachHandler",
+            "getInstance", "()Lsun/awt/X11/XErrorHandler$XShmAttachHandler;").l;
+        JNU_CallMethodByName(env, NULL, xShmAttachHandler, "setErrorOccurredFlag", "(Z)V", JNI_FALSE);
+        JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", "WITH_XERROR_HANDLER",
+            "(Lsun/awt/X11/XErrorHandler;)V", xShmAttachHandler);
+        XShmAttach(awt_display, &shminfo);
+        JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", "RESTORE_XERROR_HANDLER", "()V");
 
         /**
          * Get rid of the id now to reduce chances of leaking
          * system resources.
          */
         shmctl(shminfo.shmid, IPC_RMID, 0);
 
-        if (isXShmAttachFailed() == JNI_FALSE) {
+        if (JNU_CallMethodByName(env, NULL, xShmAttachHandler, "getErrorOccurredFlag", "()Z").z == JNI_FALSE) {
             canUseShmExt = CAN_USE_MITSHM;
             /* check if we can use shared pixmaps */
             XShmQueryVersion(awt_display, &XShmMajor, &XShmMinor,
                              (Bool*)&canUseShmExtPixmaps);
             canUseShmExtPixmaps = canUseShmExtPixmaps &&