< prev index next >

src/java.desktop/macosx/native/libosxapp/ThreadUtilities.m

Print this page
rev 54098 : 8260616: Removing remaining JNF dependencies in the java.desktop module
8259729: Missed JNFInstanceOf -> IsInstanceOf conversion

*** 22,41 **** * or visit www.oracle.com if you need additional information or have any * questions. */ #import <AppKit/AppKit.h> - #import <JavaNativeFoundation/JavaNativeFoundation.h> #import <objc/message.h> #import "ThreadUtilities.h" // The following must be named "jvm", as there are extern references to it in AWT JavaVM *jvm = NULL; static JNIEnv *appKitEnv = NULL; static jobject appkitThreadGroup = NULL; static inline void attachCurrentThread(void** env) { if ([NSThread isMainThread]) { JavaVMAttachArgs args; args.version = JNI_VERSION_1_4; --- 22,42 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ #import <AppKit/AppKit.h> #import <objc/message.h> #import "ThreadUtilities.h" // The following must be named "jvm", as there are extern references to it in AWT JavaVM *jvm = NULL; static JNIEnv *appKitEnv = NULL; static jobject appkitThreadGroup = NULL; + static NSString* JavaRunLoopMode = @"javaRunLoopMode"; + static NSArray<NSString*> *javaModes = nil; static inline void attachCurrentThread(void** env) { if ([NSThread isMainThread]) { JavaVMAttachArgs args; args.version = JNI_VERSION_1_4;
*** 47,56 **** --- 48,66 ---- } } @implementation ThreadUtilities + + (void)initialize { + /* All the standard modes plus ours */ + javaModes = [[NSArray alloc] initWithObjects:NSDefaultRunLoopMode, + NSModalPanelRunLoopMode, + NSEventTrackingRunLoopMode, + JavaRunLoopMode, + nil]; + } + + (JNIEnv*)getJNIEnv { AWT_ASSERT_APPKIT_THREAD; if (appKitEnv == NULL) { attachCurrentThread((void **)&appKitEnv); }
*** 69,94 **** + (void)setAppkitThreadGroup:(jobject)group { appkitThreadGroup = group; } + (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block { if ([NSThread isMainThread] && wait == YES) { block(); } else { ! [JNFRunLoop performOnMainThreadWaiting:wait withBlock:block]; } } + (void)performOnMainThread:(SEL)aSelector on:(id)target withObject:(id)arg waitUntilDone:(BOOL)wait { if ([NSThread isMainThread] && wait == YES) { [target performSelector:aSelector withObject:arg]; } else { ! [JNFRunLoop performOnMainThread:aSelector on:target withObject:arg waitUntilDone:wait]; } } @end void OSXAPP_SetJavaVM(JavaVM *vm) { --- 79,131 ---- + (void)setAppkitThreadGroup:(jobject)group { appkitThreadGroup = group; } + /* This is needed because we can't directly pass a block to + * performSelectorOnMainThreadWaiting .. since it expects a selector + */ + + (void)invokeBlock:(void (^)())block { + block(); + } + + /* + * When running a block where either we don't wait, or it needs to run on another thread + * we need to copy it from stack to heap, use the copy in the call and release after use. + * Do this only when we must because it could be expensive. + * Note : if waiting cross-thread, possibly the stack allocated copy is accessible ? + */ + + (void)invokeBlockCopy:(void (^)(void))blockCopy { + blockCopy(); + Block_release(blockCopy); + } + + (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block { if ([NSThread isMainThread] && wait == YES) { block(); } else { ! if (wait == YES) { ! [self performOnMainThread:@selector(invokeBlock:) on:self withObject:block waitUntilDone:YES]; ! } else { ! void (^blockCopy)(void) = Block_copy(block); ! [self performOnMainThread:@selector(invokeBlockCopy:) on:self withObject:blockCopy waitUntilDone:NO]; ! } } } + (void)performOnMainThread:(SEL)aSelector on:(id)target withObject:(id)arg waitUntilDone:(BOOL)wait { if ([NSThread isMainThread] && wait == YES) { [target performSelector:aSelector withObject:arg]; } else { ! [target performSelectorOnMainThread:aSelector withObject:arg waitUntilDone:wait modes:javaModes]; } } + + (NSString*)javaRunLoopMode { + return JavaRunLoopMode; + } + @end void OSXAPP_SetJavaVM(JavaVM *vm) {
< prev index next >