From 56e46acce6d26e0fdc2fd317649b11f1f71f621a Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sun, 26 Jun 2011 06:43:46 +0200 Subject: Woraround for bug 502: X11/NEWT Stalling due to libX11/XCB Multithreading bug (libX11 1.4.2, libXCB 1.7; ubuntu 11.04, ..) - https://jogamp.org/bugzilla/show_bug.cgi?id=502 - set the boolean property 'nativewindow.x11.mt-bug' to 'true', indicating the erroneous libX11/libXCB behavior. This will enable extensive X11 locking even in NEWT. --- .../classes/jogamp/nativewindow/x11/X11Util.java | 36 +++++++++++++++------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'src/nativewindow/classes/jogamp') diff --git a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java index 8a6869d91..117184a71 100644 --- a/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java +++ b/src/nativewindow/classes/jogamp/nativewindow/x11/X11Util.java @@ -51,19 +51,29 @@ import javax.media.nativewindow.util.Point; * Contains a thread safe X11 utility to retrieve display connections. */ public class X11Util { + /** + * 2011/06/14 libX11 1.4.2 and libxcb 1.7 bug 20708 - Multithreading Issues w/ OpenGL, .. + * https://bugs.freedesktop.org/show_bug.cgi?id=20708 + * https://jogamp.org/bugzilla/show_bug.cgi?id=502 + * Affects: Ubuntu 11.04, OpenSuSE 11, .. + * If the property nativewindow.x11.mt-bug is set to true, extensive X11 locking + * is being applied, avoiding X11 multithreading capabilities. + */ + public static final boolean MULTITHREADING_BUG = Debug.getBooleanProperty("nativewindow.x11.mt-bug", true, AccessController.getContext()); + public static final boolean XINITTHREADS_ALWAYS_ENABLED = true; + private static final boolean DEBUG = Debug.debug("X11Util"); private static final boolean TRACE_DISPLAY_LIFECYCLE = Debug.getBooleanProperty("nativewindow.debug.X11Util.TraceDisplayLifecycle", true, AccessController.getContext()); private static volatile String nullDisplayName = null; - private static boolean isFirstX11ActionOnProcess = false; + private static boolean requiresX11Lock = false; private static boolean isInit = false; private static int setX11ErrorHandlerRecCount = 0; private static Object setX11ErrorHandlerLock = new Object(); - public static final boolean XINITTHREADS_ALWAYS_ENABLED = true; - public static synchronized void initSingleton(boolean firstX11ActionOnProcess) { + public static synchronized void initSingleton(final boolean firstX11ActionOnProcess) { if(!isInit) { NWJNILibLoader.loadNativeWindow("x11"); @@ -73,10 +83,14 @@ public class X11Util { * ie NEWT (jogamp.newt.x11.X11Display.createNativeImpl()) !! */ initialize0( XINITTHREADS_ALWAYS_ENABLED ? true : firstX11ActionOnProcess ); - isFirstX11ActionOnProcess = firstX11ActionOnProcess; + requiresX11Lock = !firstX11ActionOnProcess || MULTITHREADING_BUG; + if(DEBUG) { - System.out.println("X11Util.isFirstX11ActionOnProcess: "+isFirstX11ActionOnProcess); + System.out.println("X11Util firstX11ActionOnProcess: "+firstX11ActionOnProcess+ + ", XINITTHREADS_ALWAYS_ENABLED "+XINITTHREADS_ALWAYS_ENABLED+ + ", MULTITHREADING_BUG "+MULTITHREADING_BUG+ + ", requiresX11Lock "+requiresX11Lock); } isInit = true; } @@ -101,19 +115,19 @@ public class X11Util { } } - public static boolean isFirstX11ActionOnProcess() { - return isFirstX11ActionOnProcess; + public static boolean requiresToolkitLock() { + return requiresX11Lock; } public static void lockDefaultToolkit(long dpyHandle) { NativeWindowFactory.getDefaultToolkitLock().lock(); - if(!isFirstX11ActionOnProcess) { + if(requiresX11Lock) { X11Util.XLockDisplay(dpyHandle); } } public static void unlockDefaultToolkit(long dpyHandle) { - if(!isFirstX11ActionOnProcess) { + if(requiresX11Lock) { X11Util.XUnlockDisplay(dpyHandle); } NativeWindowFactory.getDefaultToolkitLock().unlock(); @@ -124,11 +138,11 @@ public class X11Util { synchronized(X11Util.class) { if(null==nullDisplayName) { NativeWindowFactory.getDefaultToolkitLock().lock(); + long dpy = X11Lib.XOpenDisplay(null); try { - long dpy = X11Lib.XOpenDisplay(null); nullDisplayName = X11Lib.XDisplayString(dpy); - X11Lib.XCloseDisplay(dpy); } finally { + X11Lib.XCloseDisplay(dpy); NativeWindowFactory.getDefaultToolkitLock().unlock(); } if(DEBUG) { -- cgit v1.2.3