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

Print this page

        

@@ -46,12 +46,24 @@
     private InputStream stderr_stream;
 
     /* this is for the reaping thread */
     private native int waitForProcessExit(int pid);
 
+    private static String javahome;
+
+    static {
+        javahome = java.security.AccessController.doPrivileged(
+            new java.security.PrivilegedAction<String>() { public String run() {
+                return System.getProperty ("java.home");
+            }}
+        );
+    }
+
     /**
-     * Create a process using fork(2) and exec(2).
+     * Create a process using posix_spawn(2). A small helper is spawned
+     * which cleans up the inherited file descriptors and (if required)
+     * changes directory to the new WD, and then spawns the real target.
      *
      * @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

@@ -59,26 +71,41 @@
      *        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 int spawn (byte[] prog,
                                    byte[] argBlock, int argc,
                                    byte[] envBlock, int envc,
                                    byte[] dir,
                                    int[] std_fds,
                                    boolean redirectErrorStream)
+        throws IOException 
+    {
+        return forkAndExec (
+            prog, argBlock, argc, envBlock, envc, dir, std_fds,
+            javahome + "/bin/processhelper", redirectErrorStream
+        );
+    }
+
+    private native int forkAndExec (byte[] prog,
+                                   byte[] argBlock, int argc,
+                                   byte[] envBlock, int envc,
+                                   byte[] dir,
+                                   int[] std_fds,
+                                   String helper,
+                                   boolean redirectErrorStream)
         throws IOException;
 
     UNIXProcess(final byte[] prog,
                 final byte[] argBlock, int argc,
                 final byte[] envBlock, int envc,
                 final byte[] dir,
                 final int[] std_fds,
                 final boolean redirectErrorStream)
     throws IOException {
-        pid = forkAndExec(prog,
+        pid = spawn(prog,
                           argBlock, argc,
                           envBlock, envc,
                           dir,
                           std_fds,
                           redirectErrorStream);