--- old/src/solaris/classes/sun/awt/X11/MotifDnDConstants.java 2013-03-25 10:55:37.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/MotifDnDConstants.java 2013-03-25 10:55:37.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, 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 @@ -190,7 +190,7 @@ try { Native.putLong(data, motifWindow); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XlibWrapper.XChangeProperty(XToolkit.getDisplay(), defaultRootWindow, XA_MOTIF_DRAG_WINDOW.getAtom(), @@ -198,10 +198,10 @@ XConstants.PropModeReplace, data, 1); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write motif drag window handle."); } @@ -394,7 +394,7 @@ } } - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XlibWrapper.XChangeProperty(XToolkit.getDisplay(), motifWindow, XA_MOTIF_DRAG_TARGETS.getAtom(), @@ -402,15 +402,15 @@ XConstants.PropModeReplace, data, tableSize); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { // Create a new motif window and retry. motifWindow = createMotifWindow(); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XlibWrapper.XChangeProperty(XToolkit.getDisplay(), motifWindow, XA_MOTIF_DRAG_TARGETS.getAtom(), @@ -418,10 +418,10 @@ XConstants.PropModeReplace, data, tableSize); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write motif drag targets property."); } } @@ -534,16 +534,16 @@ // CARD32 icc_handle unsafe.putInt(structData + 4, (int)XA_MOTIF_ATOM_0.getAtom()); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XlibWrapper.XChangeProperty(XToolkit.getDisplay(), window, XA_MOTIF_ATOM_0.getAtom(), XA_MOTIF_DRAG_INITIATOR_INFO.getAtom(), 8, XConstants.PropModeReplace, structData, MOTIF_INITIATOR_INFO_SIZE); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write drag initiator info"); } } finally { @@ -567,16 +567,16 @@ unsafe.putShort(data + 10, (short)0); /* pad */ unsafe.putInt(data + 12, dataSize); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XlibWrapper.XChangeProperty(XToolkit.getDisplay(), window, XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), 8, XConstants.PropModeReplace, data, dataSize); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write Motif receiver info property"); } } finally { --- old/src/solaris/classes/sun/awt/X11/MotifDnDDropTargetProtocol.java 2013-03-25 10:55:38.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/MotifDnDDropTargetProtocol.java 2013-03-25 10:55:37.000000000 +0300 @@ -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 @@ -162,16 +162,16 @@ unsafe.putInt(data + 12, dataSize); } - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder, MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), 8, XConstants.PropModeReplace, data, dataSize); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write Motif receiver info property"); } } finally { @@ -236,16 +236,16 @@ unsafe.putInt(data + 4, tproxy); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder, MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), 8, XConstants.PropModeReplace, data, dataSize); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write Motif receiver info property"); } } @@ -412,15 +412,15 @@ */ XWindowAttributes wattr = new XWindowAttributes(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), source_win, wattr.pData); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (status == 0 || - (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success)) { + if ((status == 0) || + ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) { throw new XException("XGetWindowAttributes failed"); } @@ -429,15 +429,15 @@ wattr.dispose(); } - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win, source_win_mask | XConstants.StructureNotifyMask); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("XSelectInput failed"); } @@ -1024,10 +1024,10 @@ if (sourceWindow != 0) { XToolkit.awtLock(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow, sourceWindowMask); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); } finally { XToolkit.awtUnlock(); } --- old/src/solaris/classes/sun/awt/X11/WindowPropertyGetter.java 2013-03-25 10:55:38.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/WindowPropertyGetter.java 2013-03-25 10:55:38.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, 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 @@ -99,7 +99,7 @@ } if (errorHandler != null) { - XToolkit.WITH_XERROR_HANDLER(errorHandler); + XErrorHandlerUtil.WITH_XERROR_HANDLER(errorHandler); } Native.putLong(data, 0); int status = XlibWrapper.XGetWindowProperty(XToolkit.getDisplay(), window, property.getAtom(), @@ -112,7 +112,7 @@ } if (errorHandler != null) { - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); } return status; } finally { --- old/src/solaris/classes/sun/awt/X11/XConstants.java 2013-03-25 10:55:39.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XConstants.java 2013-03-25 10:55:38.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2009, 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 @@ -674,4 +674,9 @@ public static final long XkbModifierMapMask = (1L<<2); public static final long XkbVirtualModsMask = (1L<<6); //server map + /***************************************************************** + * X SHARED MEMORY EXTENSION FUNCTIONS + *****************************************************************/ + + public static final int X_ShmAttach = 1; } --- old/src/solaris/classes/sun/awt/X11/XDnDDragSourceProtocol.java 2013-03-25 10:55:39.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XDnDDragSourceProtocol.java 2013-03-25 10:55:39.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, 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 @@ -96,14 +96,14 @@ action_count++; } - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndActionList.setAtomData(window, XAtom.XA_ATOM, data, action_count); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error) != null && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { cleanup(); throw new XException("Cannot write XdndActionList property"); } @@ -117,14 +117,14 @@ try { Native.put(data, formats); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndTypeList.setAtomData(window, XAtom.XA_ATOM, data, formats.length); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { cleanup(); throw new XException("Cannot write XdndActionList property"); } --- old/src/solaris/classes/sun/awt/X11/XDnDDropTargetProtocol.java 2013-03-25 10:55:40.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XDnDDropTargetProtocol.java 2013-03-25 10:55:39.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, 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 @@ -88,12 +88,12 @@ try { Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndAware.setAtomData(window, XAtom.XA_ATOM, data, 1); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write XdndAware property"); } } finally { @@ -205,54 +205,50 @@ /* The proxy window must have the XdndAware set, as XDnD protocol prescribes to check the proxy window for XdndAware. */ - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndAware.setAtomData(newProxy, XAtom.XA_ATOM, data, 1); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != - XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write XdndAware property"); } Native.putLong(data, 0, newProxy); /* The proxy window must have the XdndProxy set to point to itself.*/ - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndProxy.setAtomData(newProxy, XAtom.XA_WINDOW, data, 1); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != - XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write XdndProxy property"); } Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM, data, 1); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != - XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write XdndAware property"); } Native.putLong(data, 0, newProxy); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW, data, 1); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != - XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write XdndProxy property"); } } finally { @@ -278,27 +274,25 @@ try { Native.putLong(data, 0, entry.getVersion()); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM, data, 1); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != - XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write XdndAware property"); } Native.putLong(data, 0, (int)entry.getProxy()); - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW, data, 1); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != - XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("Cannot write XdndProxy property"); } } finally { @@ -541,15 +535,15 @@ */ XWindowAttributes wattr = new XWindowAttributes(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), source_win, wattr.pData); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (status == 0 || - (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success)) { + if ((status == 0) || + ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) { throw new XException("XGetWindowAttributes failed"); } @@ -558,15 +552,15 @@ wattr.dispose(); } - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win, source_win_mask | XConstants.StructureNotifyMask); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("XSelectInput failed"); } @@ -963,10 +957,10 @@ if (sourceWindow != 0) { XToolkit.awtLock(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow, sourceWindowMask); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); } finally { XToolkit.awtUnlock(); } @@ -1111,15 +1105,15 @@ XToolkit.awtLock(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XDnDConstants.XA_XdndTypeList.setAtomData(xclient.get_window(), XAtom.XA_ATOM, wpg.getData(), wpg.getNumberOfItems()); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { if (logger.isLoggable(PlatformLogger.WARNING)) { logger.warning("Cannot set XdndTypeList on the proxy window"); } --- old/src/solaris/classes/sun/awt/X11/XDragSourceProtocol.java 2013-03-25 10:55:40.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XDragSourceProtocol.java 2013-03-25 10:55:40.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, 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 @@ -181,15 +181,15 @@ long time) { XWindowAttributes wattr = new XWindowAttributes(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), targetWindow, wattr.pData); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (status == 0 || - (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success)) { + if ((status == 0) || + ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) { throw new XException("XGetWindowAttributes failed"); } @@ -198,15 +198,15 @@ wattr.dispose(); } - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow, targetWindowMask | XConstants.StructureNotifyMask); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("XSelectInput failed"); } @@ -214,10 +214,10 @@ } protected final void finalizeDrop() { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow, targetWindowMask); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); } public abstract boolean processProxyModeEvent(XClientMessageEvent xclient, --- old/src/solaris/classes/sun/awt/X11/XDropTargetRegistry.java 2013-03-25 10:55:41.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XDropTargetRegistry.java 2013-03-25 10:55:40.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, 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 @@ -168,14 +168,14 @@ if (dest_x >= 0 && dest_y >= 0) { XWindowAttributes wattr = new XWindowAttributes(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), window, wattr.pData); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (status == 0 || - (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success)) { + if ((status == 0) || + ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) { continue; } @@ -222,14 +222,14 @@ long event_mask = 0; XWindowAttributes wattr = new XWindowAttributes(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), embedder, wattr.pData); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (status == 0 || - (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success)) { + if ((status == 0) || + ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) { throw new XException("XGetWindowAttributes failed"); } @@ -240,13 +240,13 @@ } if ((event_mask & XConstants.PropertyChangeMask) == 0) { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XlibWrapper.XSelectInput(XToolkit.getDisplay(), embedder, event_mask | XConstants.PropertyChangeMask); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("XSelectInput failed"); } } @@ -394,13 +394,13 @@ /* Restore the original event mask for the embedder. */ if ((event_mask & XConstants.PropertyChangeMask) == 0) { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XlibWrapper.XSelectInput(XToolkit.getDisplay(), embedder, event_mask); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { throw new XException("XSelectInput failed"); } } --- old/src/solaris/classes/sun/awt/X11/XEmbedCanvasPeer.java 2013-03-25 10:55:41.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XEmbedCanvasPeer.java 2013-03-25 10:55:41.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, 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 @@ -295,15 +295,15 @@ try { XWindowAttributes wattr = new XWindowAttributes(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), xembed.handle, wattr.pData); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (status == 0 || - (XToolkit.saved_error != null && - XToolkit.saved_error.get_error_code() != XConstants.Success)) { + if ((status == 0) || + ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) { return null; } --- old/src/solaris/classes/sun/awt/X11/XErrorHandler.java 2013-03-25 10:55:42.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XErrorHandler.java 2013-03-25 10:55:41.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -38,7 +38,30 @@ public static class XBaseErrorHandler extends XErrorHandler { @Override public int handleError(long display, XErrorEvent err) { - return XToolkit.SAVED_ERROR_HANDLER(display, err); + return XErrorHandlerUtil.SAVED_XERROR_HANDLER(display, err); + } + } + + /** + * This is a base synthetic error handler containing a boolean flag which allows + * to show that an error is handled or not. + */ + public static class XErrorHandlerWithFlag extends XBaseErrorHandler { + private volatile boolean errorOccurred = false; + + public boolean getErrorOccurredFlag() { + return errorOccurred; + } + + /** + * Sets an internal boolean flag to a particular value. Should be always called with + * false value of the parameter errorOccurred before this + * error handler is set as current. + * @param errorOccurred true to indicate that an error was handled, + * false to reset the internal boolean flag + */ + public void setErrorOccurredFlag(boolean errorOccurred) { + this.errorOccurred = errorOccurred; } } @@ -76,4 +99,51 @@ return theInstance; } } + + /** + * This is a synthetic error handler for errors generated by the native function + * XShmAttach. If an error is handled, an internal boolean flag of the + * handler is set to true. + */ + public static final class XShmAttachHandler extends XErrorHandlerWithFlag { + private XShmAttachHandler() {} + + @Override + public int handleError(long display, XErrorEvent err) { + if (err.get_minor_code() == XConstants.X_ShmAttach) { + setErrorOccurredFlag(true); + return 0; + } + return super.handleError(display, err); + } + + // Shared instance + private static XShmAttachHandler theInstance = new XShmAttachHandler(); + public static XShmAttachHandler getInstance() { + return theInstance; + } + } + + /** + * This is a synthetic error handler for BadAlloc errors generated by the + * native glX* functions. Its internal boolean flag is set to true, + * if an error is handled. + */ + public static final class GLXBadAllocHandler extends XErrorHandlerWithFlag { + private GLXBadAllocHandler() {} + + @Override + public int handleError(long display, XErrorEvent err) { + if (err.get_error_code() == XConstants.BadAlloc) { + setErrorOccurredFlag(true); + return 0; + } + return super.handleError(display, err); + } + + private static GLXBadAllocHandler theInstance = new GLXBadAllocHandler(); + public static GLXBadAllocHandler getInstance() { + return theInstance; + } + } } --- old/src/solaris/classes/sun/awt/X11/XQueryTree.java 2013-03-25 10:55:42.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XQueryTree.java 2013-03-25 10:55:42.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, 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 @@ -61,7 +61,7 @@ } __executed = true; if (errorHandler != null) { - XToolkit.WITH_XERROR_HANDLER(errorHandler); + XErrorHandlerUtil.WITH_XERROR_HANDLER(errorHandler); } Native.putLong(children_ptr, 0); int status = @@ -72,7 +72,7 @@ children_ptr, nchildren_ptr ); if (errorHandler != null) { - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); } return status; } finally { --- old/src/solaris/classes/sun/awt/X11/XToolkit.java 2013-03-25 10:55:43.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XToolkit.java 2013-03-25 10:55:42.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -128,7 +128,6 @@ initIDs(); setBackingStoreType(); } - noisyAwtHandler = AccessController.doPrivileged(new GetBooleanAction("sun.awt.noisyerrorhandler")); } /* @@ -137,78 +136,6 @@ */ static native long getTrayIconDisplayTimeout(); - //---- ERROR HANDLER CODE ----// - - /* - * Error handler at the moment of XToolkit initialization - */ - private static long saved_error_handler; - - /* - * XErrorEvent being handled - */ - static volatile XErrorEvent saved_error; - - /* - * Current error handler or null if no error handler is set - */ - private static XErrorHandler current_error_handler; - - /* - * Value of sun.awt.noisyerrorhandler system property - */ - private static boolean noisyAwtHandler; - - public static void WITH_XERROR_HANDLER(XErrorHandler handler) { - saved_error = null; - current_error_handler = handler; - } - - public static void RESTORE_XERROR_HANDLER() { - // wait until all requests are processed by the X server - // and only then uninstall the error handler - XSync(); - current_error_handler = null; - } - - // Should be called under LOCK - public static int SAVED_ERROR_HANDLER(long display, XErrorEvent error) { - if (saved_error_handler != 0) { - // Default XErrorHandler may just terminate the process. Don't call it. - // return XlibWrapper.CallErrorHandler(saved_error_handler, display, error.pData); - } - if (log.isLoggable(PlatformLogger.FINE)) { - log.fine("Unhandled XErrorEvent: " + - "id=" + error.get_resourceid() + ", " + - "serial=" + error.get_serial() + ", " + - "ec=" + error.get_error_code() + ", " + - "rc=" + error.get_request_code() + ", " + - "mc=" + error.get_minor_code()); - } - return 0; - } - - // Called from the native code when an error occurs - private static int globalErrorHandler(long display, long event_ptr) { - if (noisyAwtHandler) { - XlibWrapper.PrintXErrorEvent(display, event_ptr); - } - XErrorEvent event = new XErrorEvent(event_ptr); - saved_error = event; - try { - if (current_error_handler != null) { - return current_error_handler.handleError(display, event); - } else { - return SAVED_ERROR_HANDLER(display, event); - } - } catch (Throwable z) { - log.fine("Error in GlobalErrorHandler", z); - } - return 0; - } - - //---- END OF ERROR HANDLER CODE ----// - private native static void initIDs(); native static void waitForEvents(long nextTaskTime); static Thread toolkitThread; @@ -306,8 +233,6 @@ //set system property if not yet assigned System.setProperty("sun.awt.enableExtraMouseButtons", ""+areExtraMouseButtonsEnabled); - saved_error_handler = XlibWrapper.SetToolkitErrorHandler(); - // Detect display mode changes XlibWrapper.XSelectInput(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), XConstants.StructureNotifyMask); XToolkit.addEventDispatcher(XToolkit.getDefaultRootWindow(), new XEventDispatcher() { --- old/src/solaris/classes/sun/awt/X11/XTranslateCoordinates.java 2013-03-25 10:55:43.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XTranslateCoordinates.java 2013-03-25 10:55:43.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, 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 @@ -68,7 +68,7 @@ } __executed = true; if (errorHandler != null) { - XToolkit.WITH_XERROR_HANDLER(errorHandler); + XErrorHandlerUtil.WITH_XERROR_HANDLER(errorHandler); } int status = XlibWrapper.XTranslateCoordinates(XToolkit.getDisplay(), @@ -80,7 +80,7 @@ dest_y_ptr, child_ptr ); if (errorHandler != null) { - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); } return status; } finally { --- old/src/solaris/classes/sun/awt/X11/XWM.java 2013-03-25 10:55:44.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XWM.java 2013-03-25 10:55:44.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, 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 @@ -282,12 +282,12 @@ winmgr_running = false; substruct.set_event_mask(XConstants.SubstructureRedirectMask); - XToolkit.WITH_XERROR_HANDLER(detectWMHandler); + XErrorHandlerUtil.WITH_XERROR_HANDLER(detectWMHandler); XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), XConstants.CWEventMask, substruct.pData); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); /* * If no WM is running then our selection for SubstructureRedirect @@ -616,15 +616,16 @@ XToolkit.awtLock(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XlibWrapper.XChangePropertyS(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), XA_ICEWM_WINOPTHINT.getAtom(), XA_ICEWM_WINOPTHINT.getAtom(), 8, XConstants.PropModeReplace, new String(opt)); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); - if (XToolkit.saved_error != null && XToolkit.saved_error.get_error_code() != XConstants.Success) { + if ((XErrorHandlerUtil.saved_error != null) && + (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { log.finer("Erorr getting XA_ICEWM_WINOPTHINT property"); return false; } --- old/src/solaris/classes/sun/awt/X11/XlibUtil.java 2013-03-25 10:55:44.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XlibUtil.java 2013-03-25 10:55:44.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -151,8 +151,8 @@ { int status = xtc.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance()); if ((status != 0) && - ((XToolkit.saved_error == null) || - (XToolkit.saved_error.get_error_code() == XConstants.Success))) + ((XErrorHandlerUtil.saved_error == null) || + (XErrorHandlerUtil.saved_error.get_error_code() == XConstants.Success))) { translated = new Point(xtc.get_dest_x(), xtc.get_dest_y()); } @@ -345,13 +345,13 @@ XWindowAttributes wattr = new XWindowAttributes(); try { - XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); + XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), window, wattr.pData); - XToolkit.RESTORE_XERROR_HANDLER(); + XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); if ((status != 0) && - ((XToolkit.saved_error == null) || - (XToolkit.saved_error.get_error_code() == XConstants.Success))) + ((XErrorHandlerUtil.saved_error == null) || + (XErrorHandlerUtil.saved_error.get_error_code() == XConstants.Success))) { return wattr.get_map_state(); } --- old/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java 2013-03-25 10:55:45.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/generator/WrapperGenerator.java 2013-03-25 10:55:45.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2009, 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 @@ -992,7 +992,7 @@ pw.println("\t\t\t}"); pw.println("\t\t\t__executed = true;"); pw.println("\t\t\tif (errorHandler != null) {"); - pw.println("\t\t\t XToolkit.WITH_XERROR_HANDLER(errorHandler);"); + pw.println("\t\t\t XErrorHandlerUtil.WITH_XERROR_HANDLER(errorHandler);"); pw.println("\t\t\t}"); iter = ft.getArguments().iterator(); while (iter.hasNext()) { @@ -1021,7 +1021,7 @@ } pw.println("\t\t\t);"); pw.println("\t\t\tif (errorHandler != null) {"); - pw.println("\t\t\t XToolkit.RESTORE_XERROR_HANDLER();"); + pw.println("\t\t\t XErrorHandlerUtil.RESTORE_XERROR_HANDLER();"); pw.println("\t\t\t}"); if (!ft.isVoid()) { pw.println("\t\t\treturn status;"); --- old/src/solaris/native/sun/awt/awt_GraphicsEnv.c 2013-03-25 10:55:45.000000000 +0300 +++ new/src/solaris/native/sun/awt/awt_GraphicsEnv.c 2013-03-25 10:55:45.000000000 +0300 @@ -1,5 +1,5 @@ /* - * 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 @@ -758,6 +758,8 @@ } 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(); @@ -904,23 +906,6 @@ 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; @@ -963,21 +948,14 @@ } shminfo.readOnly = True; - resetXShmAttachFailed(); - /** - * The J2DXErrHandler handler will set xshmAttachFailed - * to JNI_TRUE if any Shm error has occured. - */ - EXEC_WITH_XERROR_HANDLER(J2DXErrHandler, - XShmAttach(awt_display, &shminfo)); - + jboolean xShmAttachResult = TryXShmAttach(env, awt_display, &shminfo); /** * Get rid of the id now to reduce chances of leaking * system resources. */ shmctl(shminfo.shmid, IPC_RMID, 0); - if (isXShmAttachFailed() == JNI_FALSE) { + if (xShmAttachResult == JNI_TRUE) { canUseShmExt = CAN_USE_MITSHM; /* check if we can use shared pixmaps */ XShmQueryVersion(awt_display, &XShmMajor, &XShmMinor, @@ -992,6 +970,20 @@ } AWT_UNLOCK(); } + +/* + * Must be called with the acquired AWT lock. + */ +jboolean TryXShmAttach(JNIEnv *env, Display *display, XShmSegmentInfo *shminfo) { + /* + * XShmAttachHandler will set its internal flag to JNI_TRUE, if any Shm error occurs. + */ + jboolean errorOccurredFlag = JNI_FALSE; + EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$XShmAttachHandler", + "()Lsun/awt/X11/XErrorHandler$XShmAttachHandler;", JNI_TRUE, errorOccurredFlag, + XShmAttach(display, shminfo)); + return errorOccurredFlag == JNI_FALSE ? JNI_TRUE : JNI_FALSE; +} #endif /* MITSHM */ /* --- old/src/solaris/native/sun/awt/awt_GraphicsEnv.h 2013-03-25 10:55:46.000000000 +0300 +++ new/src/solaris/native/sun/awt/awt_GraphicsEnv.h 2013-03-25 10:55:46.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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,7 @@ extern int XShmQueryExtension(); void TryInitMITShm(JNIEnv *env, jint *shmExt, jint *shmPixmaps); -void resetXShmAttachFailed(); -jboolean isXShmAttachFailed(); +jboolean TryXShmAttach(JNIEnv *env, Display *display, XShmSegmentInfo *shminfo); #endif /* MITSHM */ --- old/src/solaris/native/sun/awt/awt_util.c 2013-03-25 10:55:46.000000000 +0300 +++ new/src/solaris/native/sun/awt/awt_util.c 2013-03-25 10:55:46.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -41,18 +41,6 @@ #include "java_awt_event_MouseWheelEvent.h" -/* - * Since X reports protocol errors asynchronously, we often need to - * install an error handler that acts like a callback. While that - * specialized handler is installed we save original handler here. - */ -XErrorHandler xerror_saved_handler; - -/* - * A place for error handler to report the error code. - */ -unsigned char xerror_code; - extern jint getModifiers(uint32_t state, jint button, jint keyCode); extern jint getButton(uint32_t button); --- old/src/solaris/native/sun/awt/awt_util.h 2013-03-25 10:55:47.000000000 +0300 +++ new/src/solaris/native/sun/awt/awt_util.h 2013-03-25 10:55:47.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -29,42 +29,47 @@ #ifndef HEADLESS #include "gdefs.h" -#define WITH_XERROR_HANDLER(f) do { \ - XSync(awt_display, False); \ - xerror_code = Success; \ - xerror_saved_handler = XSetErrorHandler(f); \ -} while (0) - -/* Convenience macro for handlers to use */ -#define XERROR_SAVE(err) do { \ - xerror_code = (err)->error_code; \ -} while (0) - -#define RESTORE_XERROR_HANDLER do { \ - XSync(awt_display, False); \ - XSetErrorHandler(xerror_saved_handler); \ -} while (0) - -#define EXEC_WITH_XERROR_HANDLER(f, code) do { \ - WITH_XERROR_HANDLER(f); \ - do { \ - code; \ - } while (0); \ - RESTORE_XERROR_HANDLER; \ +/* + * Expected types of arguments of the macro. + * (JNIEnv*, const char*, const char*, jboolean, jobject) + */ +#define WITH_XERROR_HANDLER(env, handlerClassName, getInstanceSignature, \ + handlerHasFlag, handlerRef) do { \ + handlerRef = JNU_CallStaticMethodByName(env, NULL, handlerClassName, "getInstance", \ + getInstanceSignature).l; \ + if (handlerHasFlag == JNI_TRUE) { \ + JNU_CallMethodByName(env, NULL, handlerRef, "setErrorOccurredFlag", "(Z)V", JNI_FALSE); \ + } \ + JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", "WITH_XERROR_HANDLER", \ + "(Lsun/awt/X11/XErrorHandler;)V", handlerRef); \ } while (0) /* - * Since X reports protocol errors asynchronously, we often need to - * install an error handler that acts like a callback. While that - * specialized handler is installed we save original handler here. + * Expected types of arguments of the macro. + * (JNIEnv*) */ -extern XErrorHandler xerror_saved_handler; +#define RESTORE_XERROR_HANDLER(env) do { \ + JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", \ + "RESTORE_XERROR_HANDLER", "()V"); \ +} while (0) /* - * A place for error handler to report the error code. + * Expected types of arguments of the macro. + * (JNIEnv*, const char*, const char*, jboolean, jboolean, No type - C expression) */ -extern unsigned char xerror_code; - +#define EXEC_WITH_XERROR_HANDLER(env, handlerClassName, getInstanceSignature, \ + handlerHasFlag, errorOccurredFlag, code) do { \ + jobject handlerRef = NULL; \ + WITH_XERROR_HANDLER(env, handlerClassName, getInstanceSignature, handlerHasFlag, handlerRef); \ + do { \ + code; \ + } while (0); \ + RESTORE_XERROR_HANDLER(env); \ + if (handlerHasFlag == JNI_TRUE) { \ + errorOccurredFlag = JNU_CallMethodByName(env, NULL, handlerRef, "getErrorOccurredFlag", \ + "()Z").z; \ + } \ +} while (0) #endif /* !HEADLESS */ #ifndef INTERSECTS --- old/src/solaris/native/sun/java2d/opengl/GLXSurfaceData.c 2013-03-25 10:55:47.000000000 +0300 +++ new/src/solaris/native/sun/java2d/opengl/GLXSurfaceData.c 2013-03-25 10:55:47.000000000 +0300 @@ -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 @@ -48,8 +48,6 @@ extern void OGLSD_SetNativeDimensions(JNIEnv *env, OGLSDOps *oglsdo, jint w, jint h); -jboolean surfaceCreationFailed = JNI_FALSE; - #endif /* !HEADLESS */ JNIEXPORT void JNICALL @@ -349,18 +347,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, @@ -403,12 +389,14 @@ 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) { + AWT_LOCK(); + jboolean errorOccurredFlag = JNI_FALSE; + EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$GLXBadAllocHandler", + "()Lsun/awt/X11/XErrorHandler$GLXBadAllocHandler;", JNI_TRUE, errorOccurredFlag, + pbuffer = j2d_glXCreatePbuffer(awt_display, glxinfo->fbconfig, attrlist)); + AWT_UNLOCK(); + + if ((pbuffer == 0) || errorOccurredFlag) { J2dRlsTraceLn(J2D_TRACE_ERROR, "GLXSurfaceData_initPbuffer: could not create glx pbuffer"); return JNI_FALSE; --- old/src/solaris/native/sun/java2d/x11/X11SurfaceData.c 2013-03-25 10:55:48.000000000 +0300 +++ new/src/solaris/native/sun/java2d/x11/X11SurfaceData.c 2013-03-25 10:55:48.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -65,7 +65,6 @@ static DisposeFunc X11SD_Dispose; static GetPixmapBgFunc X11SD_GetPixmapWithBg; static ReleasePixmapBgFunc X11SD_ReleasePixmapWithBg; -extern int J2DXErrHandler(Display *display, XErrorEvent *xerr); extern AwtGraphicsConfigDataPtr getGraphicsConfigFromComponentPeer(JNIEnv *env, jobject this); extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs; @@ -559,10 +558,10 @@ shminfo->readOnly = False; - resetXShmAttachFailed(); - EXEC_WITH_XERROR_HANDLER(J2DXErrHandler, - XShmAttach(awt_display, shminfo)); - + JNIEnv* env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2); + AWT_LOCK(); + jboolean xShmAttachResult = TryXShmAttach(env, awt_display, shminfo); + AWT_UNLOCK(); /* * Once the XSync round trip has finished then we * can get rid of the id so that this segment does not stick @@ -570,7 +569,7 @@ */ shmctl(shminfo->shmid, IPC_RMID, 0); - if (isXShmAttachFailed() == JNI_TRUE) { + if (xShmAttachResult == JNI_FALSE) { J2dRlsTraceLn1(J2D_TRACE_ERROR, "X11SD_SetupSharedSegment XShmAttach has failed: %s", strerror(errno)); --- old/src/solaris/native/sun/xawt/XlibWrapper.c 2013-03-25 10:55:49.000000000 +0300 +++ new/src/solaris/native/sun/xawt/XlibWrapper.c 2013-03-25 10:55:48.000000000 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -1264,8 +1264,8 @@ if (jvm != NULL) { env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); if (env) { - return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", "globalErrorHandler", "(JJ)I", - ptr_to_jlong(dpy), ptr_to_jlong(event)).i; + return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", + "globalErrorHandler", "(JJ)I", ptr_to_jlong(dpy), ptr_to_jlong(event)).i; } } return 0; --- /dev/null 2009-04-14 14:16:08.000000000 +0400 +++ new/src/solaris/classes/sun/awt/X11/XErrorHandlerUtil.java 2013-03-25 10:55:49.000000000 +0300 @@ -0,0 +1,162 @@ +/* + * Copyright (c) 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 + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package sun.awt.X11; + +import java.security.AccessController; +import sun.awt.SunToolkit; +import sun.security.action.GetBooleanAction; +import sun.util.logging.PlatformLogger; + +/** + * This class contains code of the global toolkit error handler, exposes static + * methods which allow to set and unset synthetic error handlers. + */ +public final class XErrorHandlerUtil { + private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XErrorHandlerUtil"); + + /** + * The connection to X11 window server. + */ + private static long display; + + /** + * Error handler at the moment of XErrorHandlerUtil initialization. + */ + private static long saved_error_handler; + + /** + * XErrorEvent being handled. + */ + static volatile XErrorEvent saved_error; + + /** + * Current error handler or null if no error handler is set. + */ + private static XErrorHandler current_error_handler; + + /** + * Value of sun.awt.noisyerrorhandler system property. + */ + private static boolean noisyAwtHandler = AccessController.doPrivileged( + new GetBooleanAction("sun.awt.noisyerrorhandler")); + + /** + * The flag indicating that init was called already. + */ + private static boolean initPassed; + + /** + * Guarantees that no instance of this class can be created. + */ + private XErrorHandlerUtil() {} + + /** + * Sets the toolkit global error handler, stores the connection to X11 server, which + * will be used during an error handling process. This method is called once from + * awt_init_Display function defined in awt_GraphicsEnv.c + * file immediately after the connection to X11 window server is opened. + * @param display the connection to X11 server which should be stored + */ + private static void init(long display) { + SunToolkit.awtLock(); + try { + if (!initPassed) { + XErrorHandlerUtil.display = display; + saved_error_handler = XlibWrapper.SetToolkitErrorHandler(); + initPassed = true; + } + } finally { + SunToolkit.awtUnlock(); + } + } + + /** + * Sets a synthetic error handler. Must be called with the acquired AWT lock. + * @param handler the synthetic error handler to set + */ + public static void WITH_XERROR_HANDLER(XErrorHandler handler) { + saved_error = null; + current_error_handler = handler; + } + + /** + * Unsets a current synthetic error handler. Must be called with the acquired AWT lock. + */ + public static void RESTORE_XERROR_HANDLER() { + // Wait until all requests are processed by the X server + // and only then uninstall the error handler. + XSync(); + current_error_handler = null; + } + + /** + * Should be called under LOCK. + */ + public static int SAVED_XERROR_HANDLER(long display, XErrorEvent error) { + if (saved_error_handler != 0) { + // Default XErrorHandler may just terminate the process. Don't call it. + // return XlibWrapper.CallErrorHandler(saved_error_handler, display, error.pData); + } + if (log.isLoggable(PlatformLogger.FINE)) { + log.fine("Unhandled XErrorEvent: " + + "id=" + error.get_resourceid() + ", " + + "serial=" + error.get_serial() + ", " + + "ec=" + error.get_error_code() + ", " + + "rc=" + error.get_request_code() + ", " + + "mc=" + error.get_minor_code()); + } + return 0; + } + + /** + * Called from the native code when an error occurs. + */ + private static int globalErrorHandler(long display, long event_ptr) { + if (noisyAwtHandler) { + XlibWrapper.PrintXErrorEvent(display, event_ptr); + } + XErrorEvent event = new XErrorEvent(event_ptr); + saved_error = event; + try { + if (current_error_handler != null) { + return current_error_handler.handleError(display, event); + } else { + return SAVED_XERROR_HANDLER(display, event); + } + } catch (Throwable z) { + log.fine("Error in GlobalErrorHandler", z); + } + return 0; + } + + private static void XSync() { + SunToolkit.awtLock(); + try { + XlibWrapper.XSync(display, 0); + } finally { + SunToolkit.awtUnlock(); + } + } +}