From 8f4a77bfefc9c9e0fd7ece489f75870cc70ca145 Mon Sep 17 00:00:00 2001 From: Alexander Zuev Date: Fri, 15 Jun 2012 18:28:33 +0400 Subject: [PATCH] 7171163: [macosx] Shortcomings in the design of the secondary native event loop made JavaFX DnD deadlock Reviewed-by: anthony, art --- .../macosx/CToolkitThreadBlockedHandler.java | 5 +-- .../classes/sun/lwawt/macosx/LWCToolkit.java | 4 +-- jdk/src/macosx/native/sun/awt/LWCToolkit.m | 34 +++++-------------- .../sun/awt/dnd/SunDropTargetContextPeer.java | 2 +- 4 files changed, 14 insertions(+), 31 deletions(-) diff --git a/jdk/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java b/jdk/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java index 95d15a8feaa..94a74e5174b 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java @@ -41,10 +41,11 @@ final class CToolkitThreadBlockedHandler implements ToolkitThreadBlockedHandler } public void enter() { - toolkit.startNativeNestedEventLoop(); + // Execute the next AppKit event while we are waiting for system to + // finish our request - this will save us from biting our own tail + toolkit.executeNextAppKitEvent(); } public void exit() { - toolkit.stopNativeNestedEventLoop(); } } diff --git a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java index 0e5888ee3de..d3565b845ad 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java @@ -63,9 +63,7 @@ public class LWCToolkit extends LWToolkit { private static native void initIDs(); - static native void startNativeNestedEventLoop(); - - static native void stopNativeNestedEventLoop(); + static native void executeNextAppKitEvent(); private static CInputMethodDescriptor sInputMethodDescriptor; diff --git a/jdk/src/macosx/native/sun/awt/LWCToolkit.m b/jdk/src/macosx/native/sun/awt/LWCToolkit.m index 173154a151c..f9b17fca6b7 100644 --- a/jdk/src/macosx/native/sun/awt/LWCToolkit.m +++ b/jdk/src/macosx/native/sun/awt/LWCToolkit.m @@ -42,7 +42,6 @@ jint* gButtonDownMasks; @implementation AWTToolkit static long eventCount; -static bool shouldKeepRunningNestedLoop = NO; + (long) getEventCount{ return eventCount; @@ -460,33 +459,18 @@ Java_sun_font_FontManager_populateFontFileNameMap /* * Class: sun_lwawt_macosx_LWCToolkit - * Method: startNativeNestedEventLoop + * Method: executeNextAppKitEvent * Signature: ()V */ -JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_startNativeNestedEventLoop +JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_executeNextAppKitEvent (JNIEnv *env, jclass cls) { - if(!shouldKeepRunningNestedLoop) { - NSRunLoop *theRL = [NSRunLoop currentRunLoop]; - NSApplication * app = [NSApplication sharedApplication]; - shouldKeepRunningNestedLoop = YES; - while (shouldKeepRunningNestedLoop && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) - { - NSEvent * event = [app nextEventMatchingMask: 0xFFFFFFFF untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]; - if (event != nil) { - [app sendEvent: event]; - } - } + // Simply get the next event in native loop and pass it to execution + // We'll be called repeatedly so there's no need to block here + NSRunLoop *theRL = [NSRunLoop currentRunLoop]; + NSApplication * app = [NSApplication sharedApplication]; + NSEvent * event = [app nextEventMatchingMask: 0xFFFFFFFF untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]; + if (event != nil) { + [app sendEvent: event]; } } - -/* - * Class: sun_lwawt_macosx_LWCToolkit - * Method: stopNativeNestedEventLoop - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_stopNativeNestedEventLoop -(JNIEnv *env, jclass cls) -{ - shouldKeepRunningNestedLoop = NO; -} diff --git a/jdk/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java b/jdk/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java index 360bb9a63a6..302a6dbc62e 100644 --- a/jdk/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java +++ b/jdk/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java @@ -498,7 +498,7 @@ public abstract class SunDropTargetContextPeer implements DropTargetContextPeer, postDropTargetEvent(component, x, y, dropAction, actions, formats, nativeCtxt, SunDropTargetEvent.MOUSE_DROPPED, - !SunDropTargetContextPeer.DISPATCH_SYNC); + SunDropTargetContextPeer.DISPATCH_SYNC); } /**