--- old/src/solaris/native/sun/java2d/opengl/GLXSurfaceData.c 2013-07-12 15:40:23.000000000 +0400 +++ new/src/solaris/native/sun/java2d/opengl/GLXSurfaceData.c 2013-07-12 15:40:23.000000000 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -50,8 +50,6 @@ extern void OGLSD_SetNativeDimensions(JNIEnv *env, OGLSDOps *oglsdo, jint w, jint h); -jboolean surfaceCreationFailed = JNI_FALSE; - #endif /* !HEADLESS */ JNIEXPORT void JNICALL @@ -393,18 +391,6 @@ return JNI_TRUE; } -static int -GLXSD_BadAllocXErrHandler(Display *display, XErrorEvent *xerr) -{ - int ret = 0; - if (xerr->error_code == BadAlloc) { - surfaceCreationFailed = JNI_TRUE; - } else { - ret = (*xerror_saved_handler)(display, xerr); - } - return ret; -} - JNIEXPORT jboolean JNICALL Java_sun_java2d_opengl_GLXSurfaceData_initPbuffer (JNIEnv *env, jobject glxsd, @@ -420,6 +406,8 @@ int attrlist[] = {GLX_PBUFFER_WIDTH, 0, GLX_PBUFFER_HEIGHT, 0, GLX_PRESERVED_CONTENTS, GL_FALSE, 0}; + jboolean errorOccurredFlag; + jobject errorHandlerRef; J2dTraceLn3(J2D_TRACE_INFO, "GLXSurfaceData_initPbuffer: w=%d h=%d opq=%d", @@ -447,12 +435,15 @@ attrlist[1] = width; attrlist[3] = height; - surfaceCreationFailed = JNI_FALSE; - EXEC_WITH_XERROR_HANDLER( - GLXSD_BadAllocXErrHandler, - pbuffer = j2d_glXCreatePbuffer(awt_display, - glxinfo->fbconfig, attrlist)); - if ((pbuffer == 0) || surfaceCreationFailed) { + WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$GLXBadAllocHandler", + "()Lsun/awt/X11/XErrorHandler$GLXBadAllocHandler;", JNI_TRUE, errorHandlerRef); + pbuffer = j2d_glXCreatePbuffer(awt_display, glxinfo->fbconfig, attrlist); + // Call XSync without the acquired AWT lock to avoid a deadlock (see 8015730). + XSync(awt_display, False); + RESTORE_XERROR_HANDLER(env, JNI_FALSE); + errorOccurredFlag = GET_HANDLER_ERROR_OCCURRED_FLAG(env, errorHandlerRef); + + if ((pbuffer == 0) || errorOccurredFlag) { J2dRlsTraceLn(J2D_TRACE_ERROR, "GLXSurfaceData_initPbuffer: could not create glx pbuffer"); return JNI_FALSE;