--- old/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java 2012-05-24 18:27:47.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java 2012-05-24 18:27:47.000000000 +0400 @@ -41,10 +41,12 @@ } public void enter() { + // Despite the naming of this method, on MacOS only one + // event is read and dispatched before this method returns. + // This call is non-blocking and does not wait for an event toolkit.startNativeNestedEventLoop(); } public void exit() { - toolkit.stopNativeNestedEventLoop(); } } --- old/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java 2012-05-24 18:27:48.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java 2012-05-24 18:27:48.000000000 +0400 @@ -63,8 +63,15 @@ private static native void initIDs(); + // On Mac OS we don't need to actually start the new event loop since there is + // a mechanic that allows us to just reschedule the next event in a native event loop + // for immediate execution and because this method is being called repeatedly we just + // executing one such event every time we call this method static native void startNativeNestedEventLoop(); + // Since we don't start an additional event loop this method is a no-op + // and shouldn't be caled, left only for the better understanding of the concept on + // other OS'es static native void stopNativeNestedEventLoop(); private static CInputMethodDescriptor sInputMethodDescriptor; --- old/src/macosx/native/sun/awt/LWCToolkit.m 2012-05-24 18:27:49.000000000 +0400 +++ new/src/macosx/native/sun/awt/LWCToolkit.m 2012-05-24 18:27:49.000000000 +0400 @@ -42,7 +42,6 @@ @implementation AWTToolkit static long eventCount; -static bool shouldKeepRunningNestedLoop = NO; + (long) getEventCount{ return eventCount; @@ -466,17 +465,13 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_startNativeNestedEventLoop (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]; } } @@ -488,5 +483,5 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_stopNativeNestedEventLoop (JNIEnv *env, jclass cls) { - shouldKeepRunningNestedLoop = NO; +// At this moment it seems that this method should be no-op } --- old/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java 2012-05-24 18:27:50.000000000 +0400 +++ new/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java 2012-05-24 18:27:50.000000000 +0400 @@ -498,7 +498,7 @@ postDropTargetEvent(component, x, y, dropAction, actions, formats, nativeCtxt, SunDropTargetEvent.MOUSE_DROPPED, - !SunDropTargetContextPeer.DISPATCH_SYNC); + SunDropTargetContextPeer.DISPATCH_SYNC); } /**