jdk/src/macosx/native/sun/awt/awt.m
author serb
Fri, 18 Jan 2013 18:17:02 +0400
changeset 15322 3638f33225ec
parent 15321 da912a45f4e6
child 17142 ccc30e8c6d91
permissions -rw-r--r--
7179050: [macosx] Make LWAWT be able to run on AppKit thread Summary: Removed irrelevant assertions from the LWAWT native methods Reviewed-by: serb, anthony Contributed-by: petr.pchelko@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     1
/*
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     2
 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     4
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    10
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    15
 * accompanied this code).
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    16
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    20
 *
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    23
 * questions.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    24
 */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    25
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    26
#import <pthread.h>
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    27
#import <objc/runtime.h>
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    28
#import <Cocoa/Cocoa.h>
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    29
#import <Security/AuthSession.h>
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    30
#import <JavaNativeFoundation/JavaNativeFoundation.h>
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    31
#import <JavaRuntimeSupport/JavaRuntimeSupport.h>
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    32
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    33
#import "NSApplicationAWT.h"
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    34
#import "PropertiesUtilities.h"
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    35
#import "ThreadUtilities.h"
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    36
#import "AWT_debug.h"
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    37
#import "ApplicationDelegate.h"
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    38
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    39
#define DEBUG 0
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    40
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    41
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    42
// The symbol is defined in libosxapp.dylib (ThreadUtilities.m)
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    43
extern JavaVM *jvm;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    44
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    45
// Indicates if AWT is running embedded (in SWT, FX, elsewhere)
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    46
static BOOL isEmbedded = NO;
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    47
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    48
// Indicates that the app has been started with -XstartOnFirstThread
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    49
// (directly or via WebStart settings), and AWT should not run its
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    50
// own event loop in this mode. Even if a loop isn't running yet,
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    51
// we expect an embedder (e.g. SWT) to start it some time later.
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    52
static BOOL forceEmbeddedMode = NO;
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    53
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    54
static bool ShouldPrintVerboseDebugging() {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    55
    static int debug = -1;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    56
    if (debug == -1) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    57
        debug = (int)(getenv("JAVA_AWT_VERBOSE") != NULL) || (DEBUG != 0);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    58
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    59
    return (bool)debug;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    60
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    61
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    62
// This is the data necessary to have JNI_OnLoad wait for AppKit to start.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    63
static BOOL sAppKitStarted = NO;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    64
static pthread_mutex_t sAppKitStarted_mutex = PTHREAD_MUTEX_INITIALIZER;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    65
static pthread_cond_t sAppKitStarted_cv = PTHREAD_COND_INITIALIZER;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    66
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    67
void setBusy(BOOL isBusy);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    68
static void BusyObserver(CFRunLoopObserverRef ref, CFRunLoopActivity what, void* arg);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    69
static void NotBusyObserver(CFRunLoopObserverRef ref, CFRunLoopActivity what, void* arg);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    70
static void AWT_NSUncaughtExceptionHandler(NSException *exception);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    71
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    72
static CFRunLoopObserverRef busyObserver = NULL;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    73
static CFRunLoopObserverRef notBusyObserver = NULL;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    74
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    75
static void setUpAWTAppKit()
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    76
{
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    77
    BOOL verbose = ShouldPrintVerboseDebugging();
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    78
    if (verbose) AWT_DEBUG_LOG(@"setting up busy observers");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    79
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    80
    // Add CFRunLoopObservers to call into AWT so that AWT knows that the
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    81
    //  AWT thread (which is the AppKit main thread) is alive. This way AWT
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    82
    //  will not automatically shutdown.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    83
    busyObserver = CFRunLoopObserverCreate(
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    84
            NULL,                        // CFAllocator
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    85
            kCFRunLoopAfterWaiting,      // CFOptionFlags
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    86
            true,                        // repeats
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    87
            NSIntegerMax,                // order
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    88
            &BusyObserver,               // CFRunLoopObserverCallBack
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    89
            NULL);                       // CFRunLoopObserverContext
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    90
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    91
    notBusyObserver = CFRunLoopObserverCreate(
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    92
            NULL,                        // CFAllocator
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    93
            kCFRunLoopBeforeWaiting,     // CFOptionFlags
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    94
            true,                        // repeats
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    95
            NSIntegerMin,                // order
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    96
            &NotBusyObserver,            // CFRunLoopObserverCallBack
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
    97
            NULL);                       // CFRunLoopObserverContext
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    98
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
    99
    CFRunLoopRef runLoop = [[NSRunLoop currentRunLoop] getCFRunLoop];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   100
    CFRunLoopAddObserver(runLoop, busyObserver, kCFRunLoopDefaultMode);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   101
    CFRunLoopAddObserver(runLoop, notBusyObserver, kCFRunLoopDefaultMode);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   102
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   103
    CFRelease(busyObserver);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   104
    CFRelease(notBusyObserver);
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   105
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   106
    setBusy(YES);
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   107
}
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   108
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   109
static void setUpAppKitThreadName()
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   110
{
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   111
    BOOL verbose = ShouldPrintVerboseDebugging();
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   112
    JNIEnv *env = [ThreadUtilities getJNIEnv];
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   113
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   114
    // Set the java name of the AppKit main thread appropriately.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   115
    jclass threadClass = NULL;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   116
    jstring name = NULL;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   117
    jobject curThread = NULL;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   118
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   119
    threadClass = (*env)->FindClass(env, "java/lang/Thread");
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   120
    if (threadClass == NULL || (*env)->ExceptionCheck(env)) goto cleanup;
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   121
    jmethodID currentThreadID = (*env)->GetStaticMethodID(env, threadClass, "currentThread", "()Ljava/lang/Thread;");
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   122
    if (currentThreadID == NULL || (*env)->ExceptionCheck(env)) goto cleanup;
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   123
    jmethodID setName = (*env)->GetMethodID(env, threadClass, "setName", "(Ljava/lang/String;)V");
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   124
    if (setName == NULL || (*env)->ExceptionCheck(env)) goto cleanup;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   125
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   126
    curThread = (*env)->CallStaticObjectMethod(env, threadClass, currentThreadID); // AWT_THREADING Safe (known object)
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   127
    if (curThread == NULL || (*env)->ExceptionCheck(env)) goto cleanup;
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   128
    name = (*env)->NewStringUTF(env, "AWT-AppKit");
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   129
    if (name == NULL || (*env)->ExceptionCheck(env)) goto cleanup;
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   130
    (*env)->CallVoidMethod(env, curThread, setName, name); // AWT_THREADING Safe (known object)
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   131
    if ((*env)->ExceptionCheck(env)) goto cleanup;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   132
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   133
cleanup:
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   134
    if (threadClass != NULL) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   135
        (*env)->DeleteLocalRef(env, threadClass);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   136
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   137
    if (name != NULL) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   138
        (*env)->DeleteLocalRef(env, name);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   139
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   140
    if (curThread != NULL) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   141
        (*env)->DeleteLocalRef(env, curThread);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   142
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   143
    if ((*env)->ExceptionCheck(env)) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   144
        (*env)->ExceptionDescribe(env);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   145
        (*env)->ExceptionClear(env);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   146
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   147
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   148
    if (verbose) AWT_DEBUG_LOG(@"finished setting thread name");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   149
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   150
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   151
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   152
// Returns true if java believes it is running headless
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   153
BOOL isHeadless(JNIEnv *env) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   154
    // Just access the property directly, instead of using GraphicsEnvironment.isHeadless.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   155
    //  This is because this may be called while AWT is being loaded, and calling AWT
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   156
    //  while it is being loaded will deadlock.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   157
    static JNF_CLASS_CACHE(jc_Toolkit, "java/awt/GraphicsEnvironment");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   158
    static JNF_STATIC_MEMBER_CACHE(jm_isHeadless, jc_Toolkit, "isHeadless", "()Z");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   159
    return JNFCallStaticBooleanMethod(env, jm_isHeadless);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   160
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   161
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   162
BOOL isSWTInWebStart(JNIEnv* env) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   163
    NSString *swtWebStart = [PropertiesUtilities javaSystemPropertyForKey:@"com.apple.javaws.usingSWT" withEnv:env];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   164
    return [@"true" isCaseInsensitiveLike:swtWebStart];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   165
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   166
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   167
void setBusy(BOOL busy) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   168
AWT_ASSERT_APPKIT_THREAD;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   169
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   170
    JNIEnv *env = [ThreadUtilities getJNIEnv];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   171
    static JNF_CLASS_CACHE(jc_AWTAutoShutdown, "sun/awt/AWTAutoShutdown");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   172
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   173
    if (busy) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   174
        static JNF_STATIC_MEMBER_CACHE(jm_notifyBusyMethod, jc_AWTAutoShutdown, "notifyToolkitThreadBusy", "()V");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   175
        JNFCallStaticVoidMethod(env, jm_notifyBusyMethod);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   176
    } else {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   177
        static JNF_STATIC_MEMBER_CACHE(jm_notifyFreeMethod, jc_AWTAutoShutdown, "notifyToolkitThreadFree", "()V");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   178
        JNFCallStaticVoidMethod(env, jm_notifyFreeMethod);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   179
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   180
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   181
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   182
static void BusyObserver(CFRunLoopObserverRef ref, CFRunLoopActivity what, void* arg) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   183
AWT_ASSERT_APPKIT_THREAD;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   184
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   185
    // This is only called with the selector kCFRunLoopAfterWaiting.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   186
#ifndef PRODUCT_BUILD
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   187
    assert(what == kCFRunLoopAfterWaiting);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   188
#endif /* PRODUCT_BUILD */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   189
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   190
    setBusy(YES);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   191
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   192
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   193
static void NotBusyObserver(CFRunLoopObserverRef ref, CFRunLoopActivity what, void* arg) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   194
AWT_ASSERT_APPKIT_THREAD;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   195
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   196
    // This is only called with the selector kCFRunLoopBeforeWaiting.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   197
#ifndef PRODUCT_BUILD
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   198
    assert(what == kCFRunLoopBeforeWaiting);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   199
#endif /* PRODUCT_BUILD */
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   200
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   201
    setBusy(NO);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   202
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   203
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   204
static void AWT_NSUncaughtExceptionHandler(NSException *exception) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   205
    NSLog(@"Apple AWT Internal Exception: %@", [exception description]);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   206
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   207
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   208
// This is an empty Obj-C object just so that -peformSelectorOnMainThread can be used.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   209
@interface AWTStarter : NSObject { }
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   210
+ (void)start:(BOOL)headless;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   211
- (void)starter:(NSArray*)args;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   212
+ (void)appKitIsRunning:(id)arg;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   213
@end
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   214
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   215
@implementation AWTStarter
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   216
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   217
+ (BOOL) isConnectedToWindowServer {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   218
    SecuritySessionId session_id;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   219
    SessionAttributeBits session_info;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   220
    OSStatus status = SessionGetInfo(callerSecuritySession, &session_id, &session_info);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   221
    if (status != noErr) return NO;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   222
    if (!(session_info & sessionHasGraphicAccess)) return NO;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   223
    return YES;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   224
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   225
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   226
+ (BOOL) markAppAsDaemon {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   227
    id jrsAppKitAWTClass = objc_getClass("JRSAppKitAWT");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   228
    SEL markAppSel = @selector(markAppIsDaemon);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   229
    if (![jrsAppKitAWTClass respondsToSelector:markAppSel]) return NO;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   230
    return (BOOL)[jrsAppKitAWTClass performSelector:markAppSel];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   231
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   232
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   233
+ (void)appKitIsRunning:(id)arg {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   234
    // Headless: NO
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   235
    // Embedded: BOTH
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   236
    // Multiple Calls: NO
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   237
    //  Callers: AppKit's NSApplicationDidFinishLaunchingNotification or +[AWTStarter startAWT:]
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   238
AWT_ASSERT_APPKIT_THREAD;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   239
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   240
    BOOL verbose = ShouldPrintVerboseDebugging();
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   241
    if (verbose) AWT_DEBUG_LOG(@"about to message AppKit started");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   242
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   243
    // Signal that AppKit has started (or is already running).
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   244
    pthread_mutex_lock(&sAppKitStarted_mutex);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   245
    sAppKitStarted = YES;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   246
    pthread_cond_signal(&sAppKitStarted_cv);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   247
    pthread_mutex_unlock(&sAppKitStarted_mutex);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   248
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   249
    if (verbose) AWT_DEBUG_LOG(@"finished messaging AppKit started");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   250
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   251
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   252
+ (void)start:(BOOL)headless
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   253
{
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   254
    BOOL verbose = ShouldPrintVerboseDebugging();
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   255
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   256
    // Headless: BOTH
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   257
    // Embedded: BOTH
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   258
    // Multiple Calls: NO
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   259
    //  Caller: JNI_OnLoad
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   260
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   261
    // onMainThread is NOT the same at SWT mode!
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   262
    // If the JVM was started on the first thread for SWT, but the SWT loads the AWT on a secondary thread,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   263
    // onMainThread here will be false but SWT mode will be true.  If we are currently on the main thread, we don't
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   264
    // need to throw AWT startup over to another thread.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   265
    BOOL onMainThread = (pthread_main_np() != 0);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   266
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   267
    if (verbose) {
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   268
        NSString *msg = [NSString stringWithFormat:@"+[AWTStarter start headless:%d] { onMainThread:%d }", headless, onMainThread];
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   269
        AWT_DEBUG_LOG(msg);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   270
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   271
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   272
    if (!headless)
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   273
    {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   274
        // Listen for the NSApp to start. This indicates that JNI_OnLoad can proceed.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   275
        //  It must wait because there is a chance that another java thread will grab
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   276
        //  the AppKit lock before the +[NSApplication sharedApplication] returns.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   277
        //  See <rdar://problem/3492666> for an example.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   278
        [[NSNotificationCenter defaultCenter] addObserver:[AWTStarter class]
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   279
                                                 selector:@selector(appKitIsRunning:)
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   280
                                                     name:NSApplicationDidFinishLaunchingNotification
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   281
                                                   object:nil];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   282
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   283
        if (verbose) NSLog(@"+[AWTStarter start:::]: registered NSApplicationDidFinishLaunchingNotification");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   284
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   285
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   286
    id st = [[AWTStarter alloc] init];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   287
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   288
    NSArray * args = [NSArray arrayWithObjects:
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   289
                      [NSNumber numberWithBool: onMainThread],
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   290
                      [NSNumber numberWithBool: headless],
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   291
                      [NSNumber numberWithBool: verbose],
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   292
                      nil];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   293
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   294
    if (onMainThread) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   295
        [st starter:args];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   296
    } else {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   297
        [st performSelectorOnMainThread: @selector(starter:) withObject:args waitUntilDone:NO];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   298
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   299
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   300
    if (!headless && !onMainThread) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   301
        if (verbose) AWT_DEBUG_LOG(@"about to wait on AppKit startup mutex");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   302
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   303
        // Wait here for AppKit to have started (or for AWT to have been loaded into
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   304
        //  an already running NSApplication).
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   305
        pthread_mutex_lock(&sAppKitStarted_mutex);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   306
        while (sAppKitStarted == NO) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   307
            pthread_cond_wait(&sAppKitStarted_cv, &sAppKitStarted_mutex);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   308
        }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   309
        pthread_mutex_unlock(&sAppKitStarted_mutex);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   310
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   311
        // AWT gets here AFTER +[AWTStarter appKitIsRunning:] is called.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   312
        if (verbose) AWT_DEBUG_LOG(@"got out of the AppKit startup mutex");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   313
    }
12282
b057800f17c2 7132692: [macosx] Class com.apple.eawt not functioning
anthony
parents: 12047
diff changeset
   314
b057800f17c2 7132692: [macosx] Class com.apple.eawt not functioning
anthony
parents: 12047
diff changeset
   315
    // Don't set the delegate until the NSApplication has been created and
b057800f17c2 7132692: [macosx] Class com.apple.eawt not functioning
anthony
parents: 12047
diff changeset
   316
    // its finishLaunching has initialized it.
b057800f17c2 7132692: [macosx] Class com.apple.eawt not functioning
anthony
parents: 12047
diff changeset
   317
    //  ApplicationDelegate is the support code for com.apple.eawt.
15322
3638f33225ec 7179050: [macosx] Make LWAWT be able to run on AppKit thread
serb
parents: 15321
diff changeset
   318
    [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
12282
b057800f17c2 7132692: [macosx] Class com.apple.eawt not functioning
anthony
parents: 12047
diff changeset
   319
        OSXAPP_SetApplicationDelegate([ApplicationDelegate sharedDelegate]);
15322
3638f33225ec 7179050: [macosx] Make LWAWT be able to run on AppKit thread
serb
parents: 15321
diff changeset
   320
    }];
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   321
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   322
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   323
- (void)starter:(NSArray*)args {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   324
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   325
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   326
    BOOL onMainThread = [[args objectAtIndex:0] boolValue];
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   327
    BOOL headless = [[args objectAtIndex:1] boolValue];
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   328
    BOOL verbose = [[args objectAtIndex:2] boolValue];
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   329
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   330
    BOOL wasOnMainThread = onMainThread;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   331
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   332
    // Add the exception handler of last resort
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   333
    NSSetUncaughtExceptionHandler(AWT_NSUncaughtExceptionHandler);
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   334
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   335
    // Headless mode trumps either ordinary AWT or SWT-in-AWT mode.  Declare us a daemon and return.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   336
    if (headless) {
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   337
        if (!forceEmbeddedMode) {
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   338
            setUpAppKitThreadName();
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   339
        }
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   340
        [AWTStarter markAppAsDaemon];
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   341
        return;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   342
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   343
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   344
    if (forceEmbeddedMode) {
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   345
        if (verbose) NSLog(@"in SWT or SWT/WebStart mode");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   346
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   347
        // Init a default NSApplication instance instead of the NSApplicationAWT.
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   348
        // Note that [NSApp isRunning] will return YES after that, though
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   349
        // this behavior isn't specified anywhere. We rely on that.
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   350
        NSApplicationLoad();
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   351
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   352
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   353
    // This will create a NSApplicationAWT for standalone AWT programs, unless there is
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   354
    //  already a NSApplication instance. If there is already a NSApplication instance,
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   355
    //  and -[NSApplication isRunning] returns YES, AWT is embedded inside another
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   356
    //  AppKit Application.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   357
    NSApplication *app = [NSApplicationAWT sharedApplication];
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   358
    isEmbedded = ![NSApp isKindOfClass:[NSApplicationAWT class]];
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   359
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   360
    if (!isEmbedded) {
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   361
        // Install run loop observers and set the AppKit Java thread name
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   362
        setUpAWTAppKit();
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   363
        setUpAppKitThreadName();
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   364
    }
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   365
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   366
    // AWT gets to this point BEFORE NSApplicationDidFinishLaunchingNotification is sent.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   367
    if (![app isRunning]) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   368
        if (verbose) AWT_DEBUG_LOG(@"+[AWTStarter startAWT]: ![app isRunning]");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   369
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   370
        // This is where the AWT AppKit thread parks itself to process events.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   371
        [NSApplicationAWT runAWTLoopWithApp: app];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   372
    } else {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   373
        // We're either embedded, or showing a splash screen
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   374
        if (isEmbedded) {
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   375
            if (verbose) AWT_DEBUG_LOG(@"running embedded");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   376
14753
a56a685d137f 7154778: [macosx] NSView-based implementation of sun.awt.EmbeddedFrame
serb
parents: 12282
diff changeset
   377
            // We don't track if the runloop is busy, so set it free to let AWT finish when it needs
a56a685d137f 7154778: [macosx] NSView-based implementation of sun.awt.EmbeddedFrame
serb
parents: 12282
diff changeset
   378
            setBusy(NO);
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   379
        } else {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   380
            if (verbose) AWT_DEBUG_LOG(@"running after showing a splash screen");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   381
        }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   382
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   383
        // Signal so that JNI_OnLoad can proceed.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   384
        if (!wasOnMainThread) [AWTStarter appKitIsRunning:nil];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   385
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   386
        // Proceed to exit this call as there is no reason to run the NSApplication event loop.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   387
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   388
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   389
    [pool drain];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   390
}
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   391
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   392
@end
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   393
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   394
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   395
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   396
    BOOL verbose = ShouldPrintVerboseDebugging();
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   397
    if (verbose) AWT_DEBUG_LOG(@"entered JNI_OnLoad");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   398
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   399
    // Headless: BOTH
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   400
    // Embedded: BOTH
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   401
    // Multiple Calls: NO
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   402
    //  Caller: JavaVM classloader
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   403
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   404
    // Keep a static reference for other archives.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   405
    OSXAPP_SetJavaVM(vm);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   406
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   407
    JNIEnv *env = NULL;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   408
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   409
    // Need JNIEnv for JNF_COCOA_ENTER(env); macro below
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   410
    jint status = (*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_4);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   411
    if (status != JNI_OK || env == NULL) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   412
        AWT_DEBUG_LOG(@"Can't get JNIEnv");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   413
        return JNI_VERSION_1_4;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   414
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   415
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   416
JNF_COCOA_ENTER(env);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   417
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   418
    // Launcher sets this env variable if -XstartOnFirstThread is specified
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   419
    char envVar[80];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   420
    snprintf(envVar, sizeof(envVar), "JAVA_STARTED_ON_FIRST_THREAD_%d", getpid());
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   421
    if (getenv(envVar) != NULL) {
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   422
        forceEmbeddedMode = YES;
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   423
        unsetenv(envVar);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   424
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   425
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   426
    if (isSWTInWebStart(env)) {
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   427
        forceEmbeddedMode = YES;
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   428
    }
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   429
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   430
    BOOL headless = isHeadless(env);
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   431
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   432
    // We need to let Foundation know that this is a multithreaded application, if it isn't already.
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   433
    if (![NSThread isMultiThreaded]) {
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   434
        [NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil];
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   435
    }
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   436
15321
da912a45f4e6 8005465: [macosx] Evaluate if checking for the -XstartOnFirstThread is still needed in awt.m
anthony
parents: 14753
diff changeset
   437
    [AWTStarter start:headless];
12047
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   438
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   439
JNF_COCOA_EXIT(env);
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   440
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   441
    if (verbose) AWT_DEBUG_LOG(@"exiting JNI_OnLoad");
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   442
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   443
    return JNI_VERSION_1_4;
320a714614e9 7113349: Initial changeset for Macosx port to jdk
michaelm
parents:
diff changeset
   444
}