$OpenBSD: patch-jdk_src_share_bin_java_c,v 1.4 2011/01/11 15:47:50 kurt Exp $
--- jdk/src/share/bin/java.c.orig	Thu Dec 16 17:10:33 2010
+++ jdk/src/share/bin/java.c	Tue Jan  4 18:25:20 2011
@@ -67,6 +67,10 @@ static jboolean printUsage = JNI_FALSE;   /* print and
 static jboolean printXUsage = JNI_FALSE;  /* print and exit*/
 static char     *showSettings = NULL;      /* print but continue */
 
+#ifdef __APPLE__
+static jboolean continueInSameThread = JNI_FALSE; /* start VM in current thread */
+#endif
+
 static const char *_program_name;
 static const char *_launcher_name;
 static jboolean _is_java_args = JNI_FALSE;
@@ -117,6 +121,10 @@ static void SetPaths(int argc, char **argv);
 static void DumpState();
 static jboolean RemovableOption(char *option);
 
+#ifdef __APPLE__
+static int ContinueInSameThread(InvocationFunctions* ifn, int argc, char **argv, char *jarfile, char *classname, int ret);
+#endif
+
 /* Maximum supported entries from jvm.cfg. */
 #define INIT_MAX_KNOWN_VMS      10
 
@@ -303,9 +311,16 @@ JLI_Launch(int argc, char ** argv,              /* mai
 
     /* Show the splash screen if needed */
     ShowSplashScreen();
-
+   
+#ifdef __APPLE__
+    if (continueInSameThread == JNI_TRUE) {
+        return ContinueInSameThread(&ifn, argc, argv, jarfile, classname, ret);
+    } else {
+        return ContinueInNewThread(&ifn, argc, argv, jarfile, classname, ret);
+    }
+#else
     return ContinueInNewThread(&ifn, argc, argv, jarfile, classname, ret);
-
+#endif
 }
 /*
  * Always detach the main thread so that it appears to have ended when
@@ -1028,6 +1043,12 @@ ParseArguments(int *pargc, char ***pargv, char **pjarf
         } else if (JLI_StrCmp(arg, "-X") == 0) {
             printXUsage = JNI_TRUE;
             return JNI_TRUE;
+#ifdef __APPLE__
+        } else if (JLI_StrCmp(arg, "-XstartOnFirstThread") == 0) {
+            continueInSameThread = JNI_TRUE;
+        } else if (JLI_StrCCmp(arg, "-Xdock:") == 0) {
+           // XXXDARWIN: Apple VM supports configuration of Dock icon and name via -Xdock:
+#endif            
 /*
  * The following case checks for -XshowSettings OR -XshowSetting:SUBOPT.
  * In the latter case, any SUBOPT value not recognized will default to "all"
@@ -1941,6 +1962,44 @@ ContinueInNewThread(InvocationFunctions* ifn, int argc
       return (ret != 0) ? ret : rslt;
     }
 }
+
+#ifdef __APPLE__
+static int
+ContinueInSameThread(InvocationFunctions* ifn, int argc,
+                    char **argv, char *jarfile, char *classname, int ret)
+{
+        
+    /*
+     * If user doesn't specify stack size, check if VM has a preference.
+     * Note that HotSpot no longer supports JNI_VERSION_1_1 but it will
+     * return its default stack size through the init args structure.
+     */
+    if (threadStackSize == 0) {
+        struct JDK1_1InitArgs args1_1;
+        memset((void*)&args1_1, 0, sizeof(args1_1));
+        args1_1.version = JNI_VERSION_1_1;
+        ifn->GetDefaultJavaVMInitArgs(&args1_1);  /* ignore return value */
+        if (args1_1.javaStackSize > 0) {
+            threadStackSize = args1_1.javaStackSize;
+        }
+    }
+    
+    { /* Create create JVM and invoke main method */
+        JavaMainArgs args;
+        int rslt;
+        
+        args.argc = argc;
+        args.argv = argv;
+        args.jarfile = jarfile;
+        args.classname = classname;
+        args.ifn = *ifn;
+        
+        rslt = JavaMain((void*)&args);
+        
+        return (ret != 0) ? ret : rslt;
+    }
+}
+#endif
 
 static void
 DumpState()
