提交 2e277bee 编写于 作者: A alitvinov

8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux

Reviewed-by: art, anthony, prr
上级 7f02fb53
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -190,7 +190,7 @@ class MotifDnDConstants { ...@@ -190,7 +190,7 @@ class MotifDnDConstants {
try { try {
Native.putLong(data, motifWindow); Native.putLong(data, motifWindow);
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XlibWrapper.XChangeProperty(XToolkit.getDisplay(), XlibWrapper.XChangeProperty(XToolkit.getDisplay(),
defaultRootWindow, defaultRootWindow,
XA_MOTIF_DRAG_WINDOW.getAtom(), XA_MOTIF_DRAG_WINDOW.getAtom(),
...@@ -198,10 +198,10 @@ class MotifDnDConstants { ...@@ -198,10 +198,10 @@ class MotifDnDConstants {
XConstants.PropModeReplace, XConstants.PropModeReplace,
data, 1); data, 1);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("Cannot write motif drag window handle."); throw new XException("Cannot write motif drag window handle.");
} }
...@@ -394,7 +394,7 @@ class MotifDnDConstants { ...@@ -394,7 +394,7 @@ class MotifDnDConstants {
} }
} }
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XlibWrapper.XChangeProperty(XToolkit.getDisplay(), XlibWrapper.XChangeProperty(XToolkit.getDisplay(),
motifWindow, motifWindow,
XA_MOTIF_DRAG_TARGETS.getAtom(), XA_MOTIF_DRAG_TARGETS.getAtom(),
...@@ -402,15 +402,15 @@ class MotifDnDConstants { ...@@ -402,15 +402,15 @@ class MotifDnDConstants {
XConstants.PropModeReplace, XConstants.PropModeReplace,
data, tableSize); data, tableSize);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
// Create a new motif window and retry. // Create a new motif window and retry.
motifWindow = createMotifWindow(); motifWindow = createMotifWindow();
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XlibWrapper.XChangeProperty(XToolkit.getDisplay(), XlibWrapper.XChangeProperty(XToolkit.getDisplay(),
motifWindow, motifWindow,
XA_MOTIF_DRAG_TARGETS.getAtom(), XA_MOTIF_DRAG_TARGETS.getAtom(),
...@@ -418,10 +418,10 @@ class MotifDnDConstants { ...@@ -418,10 +418,10 @@ class MotifDnDConstants {
XConstants.PropModeReplace, XConstants.PropModeReplace,
data, tableSize); data, tableSize);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("Cannot write motif drag targets property."); throw new XException("Cannot write motif drag targets property.");
} }
} }
...@@ -534,16 +534,16 @@ class MotifDnDConstants { ...@@ -534,16 +534,16 @@ class MotifDnDConstants {
// CARD32 icc_handle // CARD32 icc_handle
unsafe.putInt(structData + 4, (int)XA_MOTIF_ATOM_0.getAtom()); 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, XlibWrapper.XChangeProperty(XToolkit.getDisplay(), window,
XA_MOTIF_ATOM_0.getAtom(), XA_MOTIF_ATOM_0.getAtom(),
XA_MOTIF_DRAG_INITIATOR_INFO.getAtom(), XA_MOTIF_DRAG_INITIATOR_INFO.getAtom(),
8, XConstants.PropModeReplace, 8, XConstants.PropModeReplace,
structData, MOTIF_INITIATOR_INFO_SIZE); structData, MOTIF_INITIATOR_INFO_SIZE);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("Cannot write drag initiator info"); throw new XException("Cannot write drag initiator info");
} }
} finally { } finally {
...@@ -567,16 +567,16 @@ class MotifDnDConstants { ...@@ -567,16 +567,16 @@ class MotifDnDConstants {
unsafe.putShort(data + 10, (short)0); /* pad */ unsafe.putShort(data + 10, (short)0); /* pad */
unsafe.putInt(data + 12, dataSize); unsafe.putInt(data + 12, dataSize);
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XlibWrapper.XChangeProperty(XToolkit.getDisplay(), window, XlibWrapper.XChangeProperty(XToolkit.getDisplay(), window,
XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
8, XConstants.PropModeReplace, 8, XConstants.PropModeReplace,
data, dataSize); data, dataSize);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("Cannot write Motif receiver info property"); throw new XException("Cannot write Motif receiver info property");
} }
} finally { } finally {
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -162,16 +162,16 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -162,16 +162,16 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol {
unsafe.putInt(data + 12, dataSize); unsafe.putInt(data + 12, dataSize);
} }
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder, XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder,
MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
8, XConstants.PropModeReplace, 8, XConstants.PropModeReplace,
data, dataSize); data, dataSize);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("Cannot write Motif receiver info property"); throw new XException("Cannot write Motif receiver info property");
} }
} finally { } finally {
...@@ -236,16 +236,16 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -236,16 +236,16 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol {
unsafe.putInt(data + 4, tproxy); unsafe.putInt(data + 4, tproxy);
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder, XlibWrapper.XChangeProperty(XToolkit.getDisplay(), embedder,
MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(), MotifDnDConstants.XA_MOTIF_DRAG_RECEIVER_INFO.getAtom(),
8, XConstants.PropModeReplace, 8, XConstants.PropModeReplace,
data, dataSize); data, dataSize);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("Cannot write Motif receiver info property"); throw new XException("Cannot write Motif receiver info property");
} }
} }
...@@ -412,15 +412,15 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -412,15 +412,15 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol {
*/ */
XWindowAttributes wattr = new XWindowAttributes(); XWindowAttributes wattr = new XWindowAttributes();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
source_win, wattr.pData); source_win, wattr.pData);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (status == 0 || if ((status == 0) ||
(XToolkit.saved_error != null && ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success)) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) {
throw new XException("XGetWindowAttributes failed"); throw new XException("XGetWindowAttributes failed");
} }
...@@ -429,15 +429,15 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -429,15 +429,15 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol {
wattr.dispose(); wattr.dispose();
} }
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win, XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win,
source_win_mask | source_win_mask |
XConstants.StructureNotifyMask); XConstants.StructureNotifyMask);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("XSelectInput failed"); throw new XException("XSelectInput failed");
} }
...@@ -1024,10 +1024,10 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -1024,10 +1024,10 @@ class MotifDnDDropTargetProtocol extends XDropTargetProtocol {
if (sourceWindow != 0) { if (sourceWindow != 0) {
XToolkit.awtLock(); XToolkit.awtLock();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow, XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow,
sourceWindowMask); sourceWindowMask);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
} finally { } finally {
XToolkit.awtUnlock(); XToolkit.awtUnlock();
} }
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -99,7 +99,7 @@ public class WindowPropertyGetter { ...@@ -99,7 +99,7 @@ public class WindowPropertyGetter {
} }
if (errorHandler != null) { if (errorHandler != null) {
XToolkit.WITH_XERROR_HANDLER(errorHandler); XErrorHandlerUtil.WITH_XERROR_HANDLER(errorHandler);
} }
Native.putLong(data, 0); Native.putLong(data, 0);
int status = XlibWrapper.XGetWindowProperty(XToolkit.getDisplay(), window, property.getAtom(), int status = XlibWrapper.XGetWindowProperty(XToolkit.getDisplay(), window, property.getAtom(),
...@@ -112,7 +112,7 @@ public class WindowPropertyGetter { ...@@ -112,7 +112,7 @@ public class WindowPropertyGetter {
} }
if (errorHandler != null) { if (errorHandler != null) {
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
} }
return status; return status;
} finally { } finally {
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -674,4 +674,9 @@ final public class XConstants { ...@@ -674,4 +674,9 @@ final public class XConstants {
public static final long XkbModifierMapMask = (1L<<2); public static final long XkbModifierMapMask = (1L<<2);
public static final long XkbVirtualModsMask = (1L<<6); //server map public static final long XkbVirtualModsMask = (1L<<6); //server map
/*****************************************************************
* X SHARED MEMORY EXTENSION FUNCTIONS
*****************************************************************/
public static final int X_ShmAttach = 1;
} }
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -96,14 +96,14 @@ class XDnDDragSourceProtocol extends XDragSourceProtocol { ...@@ -96,14 +96,14 @@ class XDnDDragSourceProtocol extends XDragSourceProtocol {
action_count++; action_count++;
} }
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XDnDConstants.XA_XdndActionList.setAtomData(window, XDnDConstants.XA_XdndActionList.setAtomData(window,
XAtom.XA_ATOM, XAtom.XA_ATOM,
data, action_count); data, action_count);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error) != null &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
cleanup(); cleanup();
throw new XException("Cannot write XdndActionList property"); throw new XException("Cannot write XdndActionList property");
} }
...@@ -117,14 +117,14 @@ class XDnDDragSourceProtocol extends XDragSourceProtocol { ...@@ -117,14 +117,14 @@ class XDnDDragSourceProtocol extends XDragSourceProtocol {
try { try {
Native.put(data, formats); Native.put(data, formats);
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XDnDConstants.XA_XdndTypeList.setAtomData(window, XDnDConstants.XA_XdndTypeList.setAtomData(window,
XAtom.XA_ATOM, XAtom.XA_ATOM,
data, formats.length); data, formats.length);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
cleanup(); cleanup();
throw new XException("Cannot write XdndActionList property"); throw new XException("Cannot write XdndActionList property");
} }
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -88,12 +88,12 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -88,12 +88,12 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol {
try { try {
Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION); 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); XDnDConstants.XA_XdndAware.setAtomData(window, XAtom.XA_ATOM, data, 1);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("Cannot write XdndAware property"); throw new XException("Cannot write XdndAware property");
} }
} finally { } finally {
...@@ -205,54 +205,50 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -205,54 +205,50 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol {
/* The proxy window must have the XdndAware set, as XDnD protocol /* The proxy window must have the XdndAware set, as XDnD protocol
prescribes to check the proxy window for XdndAware. */ 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, XDnDConstants.XA_XdndAware.setAtomData(newProxy, XAtom.XA_ATOM,
data, 1); data, 1);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
XConstants.Success) {
throw new XException("Cannot write XdndAware property"); throw new XException("Cannot write XdndAware property");
} }
Native.putLong(data, 0, newProxy); Native.putLong(data, 0, newProxy);
/* The proxy window must have the XdndProxy set to point to itself.*/ /* 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, XDnDConstants.XA_XdndProxy.setAtomData(newProxy, XAtom.XA_WINDOW,
data, 1); data, 1);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
XConstants.Success) {
throw new XException("Cannot write XdndProxy property"); throw new XException("Cannot write XdndProxy property");
} }
Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION); 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, XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM,
data, 1); data, 1);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
XConstants.Success) {
throw new XException("Cannot write XdndAware property"); throw new XException("Cannot write XdndAware property");
} }
Native.putLong(data, 0, newProxy); 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, XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW,
data, 1); data, 1);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
XConstants.Success) {
throw new XException("Cannot write XdndProxy property"); throw new XException("Cannot write XdndProxy property");
} }
} finally { } finally {
...@@ -278,27 +274,25 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -278,27 +274,25 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol {
try { try {
Native.putLong(data, 0, entry.getVersion()); 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, XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM,
data, 1); data, 1);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
XConstants.Success) {
throw new XException("Cannot write XdndAware property"); throw new XException("Cannot write XdndAware property");
} }
Native.putLong(data, 0, (int)entry.getProxy()); 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, XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW,
data, 1); data, 1);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
XConstants.Success) {
throw new XException("Cannot write XdndProxy property"); throw new XException("Cannot write XdndProxy property");
} }
} finally { } finally {
...@@ -541,15 +535,15 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -541,15 +535,15 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol {
*/ */
XWindowAttributes wattr = new XWindowAttributes(); XWindowAttributes wattr = new XWindowAttributes();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
source_win, wattr.pData); source_win, wattr.pData);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (status == 0 || if ((status == 0) ||
(XToolkit.saved_error != null && ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success)) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) {
throw new XException("XGetWindowAttributes failed"); throw new XException("XGetWindowAttributes failed");
} }
...@@ -558,15 +552,15 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -558,15 +552,15 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol {
wattr.dispose(); wattr.dispose();
} }
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win, XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win,
source_win_mask | source_win_mask |
XConstants.StructureNotifyMask); XConstants.StructureNotifyMask);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("XSelectInput failed"); throw new XException("XSelectInput failed");
} }
...@@ -963,10 +957,10 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -963,10 +957,10 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol {
if (sourceWindow != 0) { if (sourceWindow != 0) {
XToolkit.awtLock(); XToolkit.awtLock();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow, XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow,
sourceWindowMask); sourceWindowMask);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
} finally { } finally {
XToolkit.awtUnlock(); XToolkit.awtUnlock();
} }
...@@ -1111,15 +1105,15 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol { ...@@ -1111,15 +1105,15 @@ class XDnDDropTargetProtocol extends XDropTargetProtocol {
XToolkit.awtLock(); XToolkit.awtLock();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XDnDConstants.XA_XdndTypeList.setAtomData(xclient.get_window(), XDnDConstants.XA_XdndTypeList.setAtomData(xclient.get_window(),
XAtom.XA_ATOM, XAtom.XA_ATOM,
wpg.getData(), wpg.getData(),
wpg.getNumberOfItems()); wpg.getNumberOfItems());
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
if (logger.isLoggable(PlatformLogger.WARNING)) { if (logger.isLoggable(PlatformLogger.WARNING)) {
logger.warning("Cannot set XdndTypeList on the proxy window"); logger.warning("Cannot set XdndTypeList on the proxy window");
} }
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -181,15 +181,15 @@ abstract class XDragSourceProtocol { ...@@ -181,15 +181,15 @@ abstract class XDragSourceProtocol {
long time) { long time) {
XWindowAttributes wattr = new XWindowAttributes(); XWindowAttributes wattr = new XWindowAttributes();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
targetWindow, wattr.pData); targetWindow, wattr.pData);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (status == 0 || if ((status == 0) ||
(XToolkit.saved_error != null && ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success)) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) {
throw new XException("XGetWindowAttributes failed"); throw new XException("XGetWindowAttributes failed");
} }
...@@ -198,15 +198,15 @@ abstract class XDragSourceProtocol { ...@@ -198,15 +198,15 @@ abstract class XDragSourceProtocol {
wattr.dispose(); wattr.dispose();
} }
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow, XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow,
targetWindowMask | targetWindowMask |
XConstants.StructureNotifyMask); XConstants.StructureNotifyMask);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("XSelectInput failed"); throw new XException("XSelectInput failed");
} }
...@@ -214,10 +214,10 @@ abstract class XDragSourceProtocol { ...@@ -214,10 +214,10 @@ abstract class XDragSourceProtocol {
} }
protected final void finalizeDrop() { protected final void finalizeDrop() {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow, XlibWrapper.XSelectInput(XToolkit.getDisplay(), targetWindow,
targetWindowMask); targetWindowMask);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
} }
public abstract boolean processProxyModeEvent(XClientMessageEvent xclient, public abstract boolean processProxyModeEvent(XClientMessageEvent xclient,
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -168,14 +168,14 @@ final class XDropTargetRegistry { ...@@ -168,14 +168,14 @@ final class XDropTargetRegistry {
if (dest_x >= 0 && dest_y >= 0) { if (dest_x >= 0 && dest_y >= 0) {
XWindowAttributes wattr = new XWindowAttributes(); XWindowAttributes wattr = new XWindowAttributes();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
window, wattr.pData); window, wattr.pData);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (status == 0 || if ((status == 0) ||
(XToolkit.saved_error != null && ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success)) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) {
continue; continue;
} }
...@@ -222,14 +222,14 @@ final class XDropTargetRegistry { ...@@ -222,14 +222,14 @@ final class XDropTargetRegistry {
long event_mask = 0; long event_mask = 0;
XWindowAttributes wattr = new XWindowAttributes(); XWindowAttributes wattr = new XWindowAttributes();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
embedder, wattr.pData); embedder, wattr.pData);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (status == 0 || if ((status == 0) ||
(XToolkit.saved_error != null && ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success)) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) {
throw new XException("XGetWindowAttributes failed"); throw new XException("XGetWindowAttributes failed");
} }
...@@ -240,13 +240,13 @@ final class XDropTargetRegistry { ...@@ -240,13 +240,13 @@ final class XDropTargetRegistry {
} }
if ((event_mask & XConstants.PropertyChangeMask) == 0) { 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, XlibWrapper.XSelectInput(XToolkit.getDisplay(), embedder,
event_mask | XConstants.PropertyChangeMask); event_mask | XConstants.PropertyChangeMask);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("XSelectInput failed"); throw new XException("XSelectInput failed");
} }
} }
...@@ -394,13 +394,13 @@ final class XDropTargetRegistry { ...@@ -394,13 +394,13 @@ final class XDropTargetRegistry {
/* Restore the original event mask for the embedder. */ /* Restore the original event mask for the embedder. */
if ((event_mask & XConstants.PropertyChangeMask) == 0) { 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, XlibWrapper.XSelectInput(XToolkit.getDisplay(), embedder,
event_mask); event_mask);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (XToolkit.saved_error != null && if ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
throw new XException("XSelectInput failed"); throw new XException("XSelectInput failed");
} }
} }
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -301,15 +301,15 @@ public class XEmbedCanvasPeer extends XCanvasPeer implements WindowFocusListener ...@@ -301,15 +301,15 @@ public class XEmbedCanvasPeer extends XCanvasPeer implements WindowFocusListener
try { try {
XWindowAttributes wattr = new XWindowAttributes(); XWindowAttributes wattr = new XWindowAttributes();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
xembed.handle, wattr.pData); xembed.handle, wattr.pData);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if (status == 0 || if ((status == 0) ||
(XToolkit.saved_error != null && ((XErrorHandlerUtil.saved_error != null) &&
XToolkit.saved_error.get_error_code() != XConstants.Success)) { (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) {
return null; return null;
} }
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -38,7 +38,30 @@ public abstract class XErrorHandler { ...@@ -38,7 +38,30 @@ public abstract class XErrorHandler {
public static class XBaseErrorHandler extends XErrorHandler { public static class XBaseErrorHandler extends XErrorHandler {
@Override @Override
public int handleError(long display, XErrorEvent err) { 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
* <code>false</code> value of the parameter <code>errorOccurred</code> before this
* error handler is set as current.
* @param errorOccurred <code>true</code> to indicate that an error was handled,
* <code>false</code> to reset the internal boolean flag
*/
public void setErrorOccurredFlag(boolean errorOccurred) {
this.errorOccurred = errorOccurred;
} }
} }
...@@ -76,4 +99,51 @@ public abstract class XErrorHandler { ...@@ -76,4 +99,51 @@ public abstract class XErrorHandler {
return theInstance; return theInstance;
} }
} }
/**
* This is a synthetic error handler for errors generated by the native function
* <code>XShmAttach</code>. If an error is handled, an internal boolean flag of the
* handler is set to <code>true</code>.
*/
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 <code>BadAlloc</code> errors generated by the
* native <code>glX*</code> functions. Its internal boolean flag is set to <code>true</code>,
* 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;
}
}
} }
/*
* 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 <code>XErrorHandlerUtil</code> 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 <code>init</code> 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
* <code>awt_init_Display</code> function defined in <code>awt_GraphicsEnv.c</code>
* 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();
}
}
}
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -61,7 +61,7 @@ public class XQueryTree { ...@@ -61,7 +61,7 @@ public class XQueryTree {
} }
__executed = true; __executed = true;
if (errorHandler != null) { if (errorHandler != null) {
XToolkit.WITH_XERROR_HANDLER(errorHandler); XErrorHandlerUtil.WITH_XERROR_HANDLER(errorHandler);
} }
Native.putLong(children_ptr, 0); Native.putLong(children_ptr, 0);
int status = int status =
...@@ -72,7 +72,7 @@ public class XQueryTree { ...@@ -72,7 +72,7 @@ public class XQueryTree {
children_ptr, children_ptr,
nchildren_ptr ); nchildren_ptr );
if (errorHandler != null) { if (errorHandler != null) {
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
} }
return status; return status;
} finally { } finally {
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -128,7 +128,6 @@ public final class XToolkit extends UNIXToolkit implements Runnable { ...@@ -128,7 +128,6 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
initIDs(); initIDs();
setBackingStoreType(); setBackingStoreType();
} }
noisyAwtHandler = AccessController.doPrivileged(new GetBooleanAction("sun.awt.noisyerrorhandler"));
} }
/* /*
...@@ -137,78 +136,6 @@ public final class XToolkit extends UNIXToolkit implements Runnable { ...@@ -137,78 +136,6 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
*/ */
static native long getTrayIconDisplayTimeout(); 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(); private native static void initIDs();
native static void waitForEvents(long nextTaskTime); native static void waitForEvents(long nextTaskTime);
static Thread toolkitThread; static Thread toolkitThread;
...@@ -306,8 +233,6 @@ public final class XToolkit extends UNIXToolkit implements Runnable { ...@@ -306,8 +233,6 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
//set system property if not yet assigned //set system property if not yet assigned
System.setProperty("sun.awt.enableExtraMouseButtons", ""+areExtraMouseButtonsEnabled); System.setProperty("sun.awt.enableExtraMouseButtons", ""+areExtraMouseButtonsEnabled);
saved_error_handler = XlibWrapper.SetToolkitErrorHandler();
// Detect display mode changes // Detect display mode changes
XlibWrapper.XSelectInput(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), XConstants.StructureNotifyMask); XlibWrapper.XSelectInput(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), XConstants.StructureNotifyMask);
XToolkit.addEventDispatcher(XToolkit.getDefaultRootWindow(), new XEventDispatcher() { XToolkit.addEventDispatcher(XToolkit.getDefaultRootWindow(), new XEventDispatcher() {
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -68,7 +68,7 @@ public class XTranslateCoordinates { ...@@ -68,7 +68,7 @@ public class XTranslateCoordinates {
} }
__executed = true; __executed = true;
if (errorHandler != null) { if (errorHandler != null) {
XToolkit.WITH_XERROR_HANDLER(errorHandler); XErrorHandlerUtil.WITH_XERROR_HANDLER(errorHandler);
} }
int status = int status =
XlibWrapper.XTranslateCoordinates(XToolkit.getDisplay(), XlibWrapper.XTranslateCoordinates(XToolkit.getDisplay(),
...@@ -80,7 +80,7 @@ public class XTranslateCoordinates { ...@@ -80,7 +80,7 @@ public class XTranslateCoordinates {
dest_y_ptr, dest_y_ptr,
child_ptr ); child_ptr );
if (errorHandler != null) { if (errorHandler != null) {
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
} }
return status; return status;
} finally { } finally {
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -284,12 +284,12 @@ final class XWM ...@@ -284,12 +284,12 @@ final class XWM
winmgr_running = false; winmgr_running = false;
substruct.set_event_mask(XConstants.SubstructureRedirectMask); substruct.set_event_mask(XConstants.SubstructureRedirectMask);
XToolkit.WITH_XERROR_HANDLER(detectWMHandler); XErrorHandlerUtil.WITH_XERROR_HANDLER(detectWMHandler);
XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(), XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(),
XToolkit.getDefaultRootWindow(), XToolkit.getDefaultRootWindow(),
XConstants.CWEventMask, XConstants.CWEventMask,
substruct.pData); substruct.pData);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
/* /*
* If no WM is running then our selection for SubstructureRedirect * If no WM is running then our selection for SubstructureRedirect
...@@ -632,15 +632,16 @@ final class XWM ...@@ -632,15 +632,16 @@ final class XWM
XToolkit.awtLock(); XToolkit.awtLock();
try { try {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
XlibWrapper.XChangePropertyS(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), XlibWrapper.XChangePropertyS(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(),
XA_ICEWM_WINOPTHINT.getAtom(), XA_ICEWM_WINOPTHINT.getAtom(),
XA_ICEWM_WINOPTHINT.getAtom(), XA_ICEWM_WINOPTHINT.getAtom(),
8, XConstants.PropModeReplace, 8, XConstants.PropModeReplace,
new String(opt)); 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"); log.finer("Erorr getting XA_ICEWM_WINOPTHINT property");
return false; return false;
} }
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -151,8 +151,8 @@ public class XlibUtil ...@@ -151,8 +151,8 @@ public class XlibUtil
{ {
int status = xtc.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance()); int status = xtc.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
if ((status != 0) && if ((status != 0) &&
((XToolkit.saved_error == null) || ((XErrorHandlerUtil.saved_error == null) ||
(XToolkit.saved_error.get_error_code() == XConstants.Success))) (XErrorHandlerUtil.saved_error.get_error_code() == XConstants.Success)))
{ {
translated = new Point(xtc.get_dest_x(), xtc.get_dest_y()); translated = new Point(xtc.get_dest_x(), xtc.get_dest_y());
} }
...@@ -345,13 +345,13 @@ public class XlibUtil ...@@ -345,13 +345,13 @@ public class XlibUtil
XWindowAttributes wattr = new XWindowAttributes(); XWindowAttributes wattr = new XWindowAttributes();
try try
{ {
XToolkit.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance()); XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(), int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
window, wattr.pData); window, wattr.pData);
XToolkit.RESTORE_XERROR_HANDLER(); XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
if ((status != 0) && if ((status != 0) &&
((XToolkit.saved_error == null) || ((XErrorHandlerUtil.saved_error == null) ||
(XToolkit.saved_error.get_error_code() == XConstants.Success))) (XErrorHandlerUtil.saved_error.get_error_code() == XConstants.Success)))
{ {
return wattr.get_map_state(); return wattr.get_map_state();
} }
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -996,7 +996,7 @@ public class WrapperGenerator { ...@@ -996,7 +996,7 @@ public class WrapperGenerator {
pw.println("\t\t\t}"); pw.println("\t\t\t}");
pw.println("\t\t\t__executed = true;"); pw.println("\t\t\t__executed = true;");
pw.println("\t\t\tif (errorHandler != null) {"); 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}"); pw.println("\t\t\t}");
iter = ft.getArguments().iterator(); iter = ft.getArguments().iterator();
while (iter.hasNext()) { while (iter.hasNext()) {
...@@ -1025,7 +1025,7 @@ public class WrapperGenerator { ...@@ -1025,7 +1025,7 @@ public class WrapperGenerator {
} }
pw.println("\t\t\t);"); pw.println("\t\t\t);");
pw.println("\t\t\tif (errorHandler != null) {"); 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}"); pw.println("\t\t\t}");
if (!ft.isVoid()) { if (!ft.isVoid()) {
pw.println("\t\t\treturn status;"); pw.println("\t\t\treturn status;");
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -758,6 +758,8 @@ awt_init_Display(JNIEnv *env, jobject this) ...@@ -758,6 +758,8 @@ awt_init_Display(JNIEnv *env, jobject this)
} }
XSetIOErrorHandler(xioerror_handler); 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 */ /* set awt_numScreens, and whether or not we're using Xinerama */
xineramaInit(); xineramaInit();
...@@ -904,28 +906,12 @@ Java_sun_awt_X11GraphicsDevice_getDisplay(JNIEnv *env, jobject this) ...@@ -904,28 +906,12 @@ Java_sun_awt_X11GraphicsDevice_getDisplay(JNIEnv *env, jobject this)
static jint canUseShmExt = UNSET_MITSHM; static jint canUseShmExt = UNSET_MITSHM;
static jint canUseShmExtPixmaps = 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) { void TryInitMITShm(JNIEnv *env, jint *shmExt, jint *shmPixmaps) {
XShmSegmentInfo shminfo; XShmSegmentInfo shminfo;
int XShmMajor, XShmMinor; int XShmMajor, XShmMinor;
int a, b, c; int a, b, c;
jboolean xShmAttachResult;
AWT_LOCK(); AWT_LOCK();
if (canUseShmExt != UNSET_MITSHM) { if (canUseShmExt != UNSET_MITSHM) {
...@@ -963,21 +949,14 @@ void TryInitMITShm(JNIEnv *env, jint *shmExt, jint *shmPixmaps) { ...@@ -963,21 +949,14 @@ void TryInitMITShm(JNIEnv *env, jint *shmExt, jint *shmPixmaps) {
} }
shminfo.readOnly = True; shminfo.readOnly = True;
resetXShmAttachFailed(); xShmAttachResult = TryXShmAttach(env, awt_display, &shminfo);
/**
* The J2DXErrHandler handler will set xshmAttachFailed
* to JNI_TRUE if any Shm error has occured.
*/
EXEC_WITH_XERROR_HANDLER(J2DXErrHandler,
XShmAttach(awt_display, &shminfo));
/** /**
* Get rid of the id now to reduce chances of leaking * Get rid of the id now to reduce chances of leaking
* system resources. * system resources.
*/ */
shmctl(shminfo.shmid, IPC_RMID, 0); shmctl(shminfo.shmid, IPC_RMID, 0);
if (isXShmAttachFailed() == JNI_FALSE) { if (xShmAttachResult == JNI_TRUE) {
canUseShmExt = CAN_USE_MITSHM; canUseShmExt = CAN_USE_MITSHM;
/* check if we can use shared pixmaps */ /* check if we can use shared pixmaps */
XShmQueryVersion(awt_display, &XShmMajor, &XShmMinor, XShmQueryVersion(awt_display, &XShmMajor, &XShmMinor,
...@@ -992,6 +971,23 @@ void TryInitMITShm(JNIEnv *env, jint *shmExt, jint *shmPixmaps) { ...@@ -992,6 +971,23 @@ void TryInitMITShm(JNIEnv *env, jint *shmExt, jint *shmPixmaps) {
} }
AWT_UNLOCK(); AWT_UNLOCK();
} }
/*
* Must be called with the acquired AWT lock.
*/
jboolean TryXShmAttach(JNIEnv *env, Display *display, XShmSegmentInfo *shminfo) {
jboolean errorOccurredFlag = JNI_FALSE;
jobject errorHandlerRef;
/*
* XShmAttachHandler will set its internal flag to JNI_TRUE, if any Shm error occurs.
*/
EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$XShmAttachHandler",
"()Lsun/awt/X11/XErrorHandler$XShmAttachHandler;", JNI_TRUE,
errorHandlerRef, errorOccurredFlag,
XShmAttach(display, shminfo));
return errorOccurredFlag == JNI_FALSE ? JNI_TRUE : JNI_FALSE;
}
#endif /* MITSHM */ #endif /* MITSHM */
/* /*
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -50,8 +50,7 @@ ...@@ -50,8 +50,7 @@
extern int XShmQueryExtension(); extern int XShmQueryExtension();
void TryInitMITShm(JNIEnv *env, jint *shmExt, jint *shmPixmaps); void TryInitMITShm(JNIEnv *env, jint *shmExt, jint *shmPixmaps);
void resetXShmAttachFailed(); jboolean TryXShmAttach(JNIEnv *env, Display *display, XShmSegmentInfo *shminfo);
jboolean isXShmAttachFailed();
#endif /* MITSHM */ #endif /* MITSHM */
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -41,18 +41,6 @@ ...@@ -41,18 +41,6 @@
#include "java_awt_event_MouseWheelEvent.h" #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 getModifiers(uint32_t state, jint button, jint keyCode);
extern jint getButton(uint32_t button); extern jint getButton(uint32_t button);
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -29,42 +29,47 @@ ...@@ -29,42 +29,47 @@
#ifndef HEADLESS #ifndef HEADLESS
#include "gdefs.h" #include "gdefs.h"
#define WITH_XERROR_HANDLER(f) do { \ /*
XSync(awt_display, False); \ * Expected types of arguments of the macro.
xerror_code = Success; \ * (JNIEnv*, const char*, const char*, jboolean, jobject)
xerror_saved_handler = XSetErrorHandler(f); \ */
} while (0) #define WITH_XERROR_HANDLER(env, handlerClassName, getInstanceSignature, \
handlerHasFlag, handlerRef) do { \
/* Convenience macro for handlers to use */ handlerRef = JNU_CallStaticMethodByName(env, NULL, handlerClassName, "getInstance", \
#define XERROR_SAVE(err) do { \ getInstanceSignature).l; \
xerror_code = (err)->error_code; \ if (handlerHasFlag == JNI_TRUE) { \
} while (0) JNU_CallMethodByName(env, NULL, handlerRef, "setErrorOccurredFlag", "(Z)V", JNI_FALSE); \
} \
#define RESTORE_XERROR_HANDLER do { \ JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", "WITH_XERROR_HANDLER", \
XSync(awt_display, False); \ "(Lsun/awt/X11/XErrorHandler;)V", handlerRef); \
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; \
} while (0) } while (0)
/* /*
* Since X reports protocol errors asynchronously, we often need to * Expected types of arguments of the macro.
* install an error handler that acts like a callback. While that * (JNIEnv*)
* specialized handler is installed we save original handler here.
*/ */
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, jobject, jboolean, No type - C expression)
*/ */
extern unsigned char xerror_code; #define EXEC_WITH_XERROR_HANDLER(env, handlerClassName, getInstanceSignature, handlerHasFlag, \
handlerRef, errorOccurredFlag, code) do { \
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 */ #endif /* !HEADLESS */
#ifndef INTERSECTS #ifndef INTERSECTS
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -48,8 +48,6 @@ extern DisposeFunc OGLSD_Dispose; ...@@ -48,8 +48,6 @@ extern DisposeFunc OGLSD_Dispose;
extern void extern void
OGLSD_SetNativeDimensions(JNIEnv *env, OGLSDOps *oglsdo, jint w, jint h); OGLSD_SetNativeDimensions(JNIEnv *env, OGLSDOps *oglsdo, jint w, jint h);
jboolean surfaceCreationFailed = JNI_FALSE;
#endif /* !HEADLESS */ #endif /* !HEADLESS */
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
...@@ -349,18 +347,6 @@ OGLSD_InitOGLWindow(JNIEnv *env, OGLSDOps *oglsdo) ...@@ -349,18 +347,6 @@ OGLSD_InitOGLWindow(JNIEnv *env, OGLSDOps *oglsdo)
return JNI_TRUE; 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 JNIEXPORT jboolean JNICALL
Java_sun_java2d_opengl_GLXSurfaceData_initPbuffer Java_sun_java2d_opengl_GLXSurfaceData_initPbuffer
(JNIEnv *env, jobject glxsd, (JNIEnv *env, jobject glxsd,
...@@ -376,6 +362,8 @@ Java_sun_java2d_opengl_GLXSurfaceData_initPbuffer ...@@ -376,6 +362,8 @@ Java_sun_java2d_opengl_GLXSurfaceData_initPbuffer
int attrlist[] = {GLX_PBUFFER_WIDTH, 0, int attrlist[] = {GLX_PBUFFER_WIDTH, 0,
GLX_PBUFFER_HEIGHT, 0, GLX_PBUFFER_HEIGHT, 0,
GLX_PRESERVED_CONTENTS, GL_FALSE, 0}; GLX_PRESERVED_CONTENTS, GL_FALSE, 0};
jboolean errorOccurredFlag;
jobject errorHandlerRef;
J2dTraceLn3(J2D_TRACE_INFO, J2dTraceLn3(J2D_TRACE_INFO,
"GLXSurfaceData_initPbuffer: w=%d h=%d opq=%d", "GLXSurfaceData_initPbuffer: w=%d h=%d opq=%d",
...@@ -403,12 +391,13 @@ Java_sun_java2d_opengl_GLXSurfaceData_initPbuffer ...@@ -403,12 +391,13 @@ Java_sun_java2d_opengl_GLXSurfaceData_initPbuffer
attrlist[1] = width; attrlist[1] = width;
attrlist[3] = height; attrlist[3] = height;
surfaceCreationFailed = JNI_FALSE; errorOccurredFlag = JNI_FALSE;
EXEC_WITH_XERROR_HANDLER( EXEC_WITH_XERROR_HANDLER(env, "sun/awt/X11/XErrorHandler$GLXBadAllocHandler",
GLXSD_BadAllocXErrHandler, "()Lsun/awt/X11/XErrorHandler$GLXBadAllocHandler;", JNI_TRUE,
pbuffer = j2d_glXCreatePbuffer(awt_display, errorHandlerRef, errorOccurredFlag,
glxinfo->fbconfig, attrlist)); pbuffer = j2d_glXCreatePbuffer(awt_display, glxinfo->fbconfig, attrlist));
if ((pbuffer == 0) || surfaceCreationFailed) {
if ((pbuffer == 0) || errorOccurredFlag) {
J2dRlsTraceLn(J2D_TRACE_ERROR, J2dRlsTraceLn(J2D_TRACE_ERROR,
"GLXSurfaceData_initPbuffer: could not create glx pbuffer"); "GLXSurfaceData_initPbuffer: could not create glx pbuffer");
return JNI_FALSE; return JNI_FALSE;
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -65,7 +65,6 @@ static UnlockFunc X11SD_Unlock; ...@@ -65,7 +65,6 @@ static UnlockFunc X11SD_Unlock;
static DisposeFunc X11SD_Dispose; static DisposeFunc X11SD_Dispose;
static GetPixmapBgFunc X11SD_GetPixmapWithBg; static GetPixmapBgFunc X11SD_GetPixmapWithBg;
static ReleasePixmapBgFunc X11SD_ReleasePixmapWithBg; static ReleasePixmapBgFunc X11SD_ReleasePixmapWithBg;
extern int J2DXErrHandler(Display *display, XErrorEvent *xerr);
extern AwtGraphicsConfigDataPtr extern AwtGraphicsConfigDataPtr
getGraphicsConfigFromComponentPeer(JNIEnv *env, jobject this); getGraphicsConfigFromComponentPeer(JNIEnv *env, jobject this);
extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs; extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs;
...@@ -521,6 +520,8 @@ XImage* X11SD_CreateSharedImage(X11SDOps *xsdo, ...@@ -521,6 +520,8 @@ XImage* X11SD_CreateSharedImage(X11SDOps *xsdo,
{ {
XImage *img = NULL; XImage *img = NULL;
XShmSegmentInfo *shminfo; XShmSegmentInfo *shminfo;
JNIEnv* env;
jboolean xShmAttachResult;
shminfo = malloc(sizeof(XShmSegmentInfo)); shminfo = malloc(sizeof(XShmSegmentInfo));
if (shminfo == NULL) { if (shminfo == NULL) {
...@@ -559,9 +560,8 @@ XImage* X11SD_CreateSharedImage(X11SDOps *xsdo, ...@@ -559,9 +560,8 @@ XImage* X11SD_CreateSharedImage(X11SDOps *xsdo,
shminfo->readOnly = False; shminfo->readOnly = False;
resetXShmAttachFailed(); env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_2);
EXEC_WITH_XERROR_HANDLER(J2DXErrHandler, xShmAttachResult = TryXShmAttach(env, awt_display, shminfo);
XShmAttach(awt_display, shminfo));
/* /*
* Once the XSync round trip has finished then we * Once the XSync round trip has finished then we
...@@ -570,7 +570,7 @@ XImage* X11SD_CreateSharedImage(X11SDOps *xsdo, ...@@ -570,7 +570,7 @@ XImage* X11SD_CreateSharedImage(X11SDOps *xsdo,
*/ */
shmctl(shminfo->shmid, IPC_RMID, 0); shmctl(shminfo->shmid, IPC_RMID, 0);
if (isXShmAttachFailed() == JNI_TRUE) { if (xShmAttachResult == JNI_FALSE) {
J2dRlsTraceLn1(J2D_TRACE_ERROR, J2dRlsTraceLn1(J2D_TRACE_ERROR,
"X11SD_SetupSharedSegment XShmAttach has failed: %s", "X11SD_SetupSharedSegment XShmAttach has failed: %s",
strerror(errno)); strerror(errno));
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -1264,8 +1264,8 @@ static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) { ...@@ -1264,8 +1264,8 @@ static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
if (jvm != NULL) { if (jvm != NULL) {
env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
if (env) { if (env) {
return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", "globalErrorHandler", "(JJ)I", return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil",
ptr_to_jlong(dpy), ptr_to_jlong(event)).i; "globalErrorHandler", "(JJ)I", ptr_to_jlong(dpy), ptr_to_jlong(event)).i;
} }
} }
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册