From e3ab8ba856ce51b61f34e8cd8d892061a8d2f2c3 Mon Sep 17 00:00:00 2001 From: Alexander Zuev Date: Thu, 3 May 2012 21:54:29 +0400 Subject: [PATCH] 7148289: [macosx] Deadlock in sun.lwawt.macosx.CWrapper$NSScreen.visibleFrame Reviewed-by: leonidr --- .../macosx/CToolkitThreadBlockedHandler.java | 7 ++-- .../classes/sun/lwawt/macosx/LWCToolkit.java | 4 +++ jdk/src/macosx/native/sun/awt/LWCToolkit.m | 34 +++++++++++++++++++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/jdk/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java b/jdk/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java index 2d36a914122..95d15a8feaa 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CToolkitThreadBlockedHandler.java @@ -27,9 +27,9 @@ package sun.lwawt.macosx; import sun.awt.datatransfer.ToolkitThreadBlockedHandler; -// TODO:BG this class is really a NOOP right now, but should be filled in if needed. - final class CToolkitThreadBlockedHandler implements ToolkitThreadBlockedHandler { + private final LWCToolkit toolkit = (LWCToolkit)java.awt.Toolkit.getDefaultToolkit(); + public void lock() { } @@ -41,9 +41,10 @@ final class CToolkitThreadBlockedHandler implements ToolkitThreadBlockedHandler } public void enter() { + toolkit.startNativeNestedEventLoop(); } 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 05c4ceeaec8..fa13d0ef675 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java @@ -63,6 +63,10 @@ public class LWCToolkit extends LWToolkit { private static native void initIDs(); + static native void startNativeNestedEventLoop(); + + static native void stopNativeNestedEventLoop(); + private static CInputMethodDescriptor sInputMethodDescriptor; static { diff --git a/jdk/src/macosx/native/sun/awt/LWCToolkit.m b/jdk/src/macosx/native/sun/awt/LWCToolkit.m index 8a95cd38d3d..173154a151c 100644 --- a/jdk/src/macosx/native/sun/awt/LWCToolkit.m +++ b/jdk/src/macosx/native/sun/awt/LWCToolkit.m @@ -42,6 +42,7 @@ jint* gButtonDownMasks; @implementation AWTToolkit static long eventCount; +static bool shouldKeepRunningNestedLoop = NO; + (long) getEventCount{ return eventCount; @@ -456,3 +457,36 @@ Java_sun_font_FontManager_populateFontFileNameMap { } + +/* + * Class: sun_lwawt_macosx_LWCToolkit + * Method: startNativeNestedEventLoop + * Signature: ()V + */ +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]; + } + } + } +} + +/* + * Class: sun_lwawt_macosx_LWCToolkit + * Method: stopNativeNestedEventLoop + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_stopNativeNestedEventLoop +(JNIEnv *env, jclass cls) +{ + shouldKeepRunningNestedLoop = NO; +}