--- old/src/solaris/classes/sun/awt/X11/XErrorHandler.java 2013-02-18 18:36:38.000000000 +0300 +++ new/src/solaris/classes/sun/awt/X11/XErrorHandler.java 2013-02-18 18:36:37.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; + } + } }