src/solaris/classes/java/lang/UNIXProcess.java.bsd

Print this page

        

@@ -62,15 +62,50 @@
 
     private /* final */ OutputStream stdin;
     private /* final */ InputStream  stdout;
     private /* final */ InputStream  stderr;
 
+    private static String javahome;
+    private static String arch;
+    private static String helperpath;
+
+    enum LaunchMechanism {
+        CLONE(1), FORK(2),
+        VFORK(3), SPAWN(4);
+
+        private int value;
+        LaunchMechanism(int x) {value = x;}
+    };
+
+    /* On BSD, the default is to spawn */
+    private static LaunchMechanism launchMechanism = LaunchMechanism.SPAWN;
+
+    static {
+        AccessController.doPrivileged(new PrivilegedAction<Void>() {
+            public Void run() {
+                String javahome = System.getProperty("java.home");
+                String osarch = System.getProperty("os.arch");
+                
+                helperpath = javahome + "/lib/jspawnhelper";
+                String s = System.getProperty("java.lang.useFork");
+                if (s != null) {
+                    launchMechanism = LaunchMechanism.FORK;
+                }
+                return null;
+            }
+        });
+    }
+
     /* this is for the reaping thread */
     private native int waitForProcessExit(int pid);
 
     /**
-     * Create a process using fork(2) and exec(2).
+     * Create a process. Depending on the mode flag, this is done by
+     * one of the following mechanisms.
+     * - fork(2) and exec(2)
+     * - vfork(2) and exec(2)
+     * - posix_spawn(2)
      *
      * @param fds an array of three file descriptors.
      *        Indexes 0, 1, and 2 correspond to standard input,
      *        standard output and standard error, respectively.  On
      *        input, a value of -1 means to create a pipe to connect

@@ -79,11 +114,11 @@
      *        pipe which has been created.  An element of this array
      *        is -1 on input if and only if it is <em>not</em> -1 on
      *        output.
      * @return the pid of the subprocess
      */
-    private native int forkAndExec(byte[] prog,
+    private native int forkAndExec(int mode, byte[] prog,
                                    byte[] argBlock, int argc,
                                    byte[] envBlock, int envc,
                                    byte[] dir,
                                    int[] fds,
                                    boolean redirectErrorStream)

@@ -131,11 +166,12 @@
                 final byte[] dir,
                 final int[] fds,
                 final boolean redirectErrorStream)
             throws IOException {
 
-        pid = forkAndExec(prog,
+        pid = forkAndExec(launchMechanism.value,
+                          prog,
                           argBlock, argc,
                           envBlock, envc,
                           dir,
                           fds,
                           redirectErrorStream);