/** * Cleanup resources. * * <p>Called by {@link NativeWindowFactory#shutdown()} * * @see ToolkitProperties */ public static void shutdown() { if (isInit) { synchronized (X11Util.class) { if (isInit) { final boolean isJVMShuttingDown = NativeWindowFactory.isJVMShuttingDown(); if (DEBUG || ((openDisplayMap.size() > 0 || reusableDisplayList.size() > 0 || pendingDisplayList.size() > 0) && (reusableDisplayList.size() != pendingDisplayList.size() || !markAllDisplaysUnclosable))) { System.err.println( "X11Util.Display: Shutdown (JVM shutdown: " + isJVMShuttingDown + ", open (no close attempt): " + openDisplayMap.size() + "/" + openDisplayList.size() + ", reusable (open, marked uncloseable): " + reusableDisplayList.size() + ", pending (open in creation order): " + pendingDisplayList.size() + ")"); if (DEBUG) { Thread.dumpStack(); } if (openDisplayList.size() > 0) { X11Util.dumpOpenDisplayConnections(); } if (DEBUG) { if (reusableDisplayList.size() > 0 || pendingDisplayList.size() > 0) { X11Util.dumpPendingDisplayConnections(); } } } // Only at JVM shutdown time, since AWT impl. seems to // dislike closing of X11 Display's (w/ ATI driver). if (isJVMShuttingDown) { synchronized (globalLock) { isInit = false; closePendingDisplayConnections(); openDisplayList.clear(); reusableDisplayList.clear(); pendingDisplayList.clear(); openDisplayMap.clear(); displayXineramaEnabledMap.clear(); shutdown0(); } } } } } }