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

Print this page

        

@@ -25,10 +25,12 @@
 
 package java.lang;
 
 import java.io.*;
 import java.util.concurrent.TimeUnit;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 
 /* java.lang.Process subclass in the UNIX environment.
  *
  * @author Mario Wolczko and Ross Knippel.
  */

@@ -44,15 +46,60 @@
     private OutputStream stdin_stream;
     private InputStream stdout_stream;
     private DeferredCloseInputStream stdout_inner_stream;
     private InputStream stderr_stream;
 
+    private static String javahome;
+    private static String arch;
+    private static String helperpath;
+
+    enum LaunchMechanism {
+        CLONE(1), FORK(2),
+        VFORK(3), POSIX_SPAWN(4);
+
+        private int value;
+        LaunchMechanism(int x) {value = x;}
+    };
+
+    /* On Solaris, the default is to spawn */
+    private static LaunchMechanism launchMechanism = LaunchMechanism.POSIX_SPAWN;
+
+    static {
+        AccessController.doPrivileged(new PrivilegedAction<Void>() {
+            public Void run() {
+                String javahome = System.getProperty("java.home");
+                String osarch = System.getProperty("os.arch");
+                if (osarch.equals("x86")) {
+                    osarch = "i386";
+                } else if (osarch.equals("x86_64")) {
+                    osarch = "amd64";
+                }
+
+                helperpath = javahome + "/lib/" + osarch + "/jspawnhelper";
+                String s = System.getProperty("jdk.lang.Process.launchMechanism");
+                if (s != null && !s.equals("POSIX_SPAWN")) {
+                    if (s.equals("FORK")) {
+                        launchMechanism = LaunchMechanism.FORK;
+                    } else {
+                        throw new Error(s + " is not a supported " +
+                            "process launch mechanism on this platform.");
+                    }
+                }
+                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 std_fds array of 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 child and parent

@@ -60,11 +107,11 @@
      *        parent pipe fd corresponding to the 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[] std_fds,
                                    boolean redirectErrorStream)

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