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);