8051857: OperationTimedOut exception inside from XToolkit.syncNativeQueue call

Reviewed-by: alexsch, serb
This commit is contained in:
Alexander Zvegintsev 2014-09-26 18:43:44 +04:00
parent 6a281f9f56
commit ebc6607b65
2 changed files with 14 additions and 5 deletions

View File

@ -52,6 +52,8 @@
*/ */
extern XErrorHandler current_native_xerror_handler; extern XErrorHandler current_native_xerror_handler;
Window get_xawt_root_shell(JNIEnv *env);
#endif /* !HEADLESS */ #endif /* !HEADLESS */
#ifndef INTERSECTS #ifndef INTERSECTS

View File

@ -2011,10 +2011,14 @@ static Bool exitSecondaryLoop = True;
* Toolkit thread to process PropertyNotify or SelectionNotify events. * Toolkit thread to process PropertyNotify or SelectionNotify events.
*/ */
static Bool static Bool
secondary_loop_event(Display* dpy, XEvent* event, char* arg) { secondary_loop_event(Display* dpy, XEvent* event, XPointer xawt_root_window) {
return (event->type == SelectionNotify || return (
event->type == SelectionClear || event->type == SelectionNotify ||
event->type == PropertyNotify) ? True : False; event->type == SelectionClear ||
event->type == PropertyNotify ||
(event->type == ConfigureNotify
&& event->xany.window == *(Window*) xawt_root_window)
) ? True : False;
} }
@ -2025,8 +2029,11 @@ Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent(JNIEnv *env, jclass clazz,
AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
exitSecondaryLoop = False; exitSecondaryLoop = False;
Window xawt_root_window = get_xawt_root_shell(env);
while (!exitSecondaryLoop) { while (!exitSecondaryLoop) {
if (XCheckIfEvent((Display*) jlong_to_ptr(display), (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, NULL)) { if (XCheckIfEvent((Display*) jlong_to_ptr(display),
(XEvent*) jlong_to_ptr(ptr), secondary_loop_event, (XPointer) &xawt_root_window)) {
return JNI_TRUE; return JNI_TRUE;
} }
timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT; timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT;