6850720: Allow POSIX_SPAWN to be used for ProcessImpl on Linux

David Lloyd david.lloyd at redhat.com
Thu Oct 18 21:42:50 UTC 2018


The issue 6850720 isn't _exactly_ to use POSIX_SPAWN for process
launching on Linux, but it's the closest I could find out of what are
really a surprisingly large number of issues that refer to posix_spawn
in one way or another relating to ProcessImpl.  There's a different
issue to move from vfork to posix_spawn on Solaris, but I wasn't sure
if that one was quite right to hang this off of.  Maybe it should be
yet another issue of its own.

Anyway: this is a follow-up to the email thread entitled "Runtime.exec
: vfork() concerns and a fix proposal", where it was casually
mentioned that maybe posix_spawn could become an option on Linux,
whereafter it could be thoroughly tested by brave individuals and
eventually maybe become the default on that platform, obsoleting the
vfork support for good.

The following patch does just that.  I've tested it launching a
multi-process WildFly instance a bunch of times, in conjunction with
the conveniently existent "jdk.lang.Process.launchMechanism" property,
and nothing exploded so here it is.  The usual deal with git patches:
apply directly through "patch -p1".

commit f0eb9ff7c46dff76f91160491fcca0eb25d0ab95
Author: David M. Lloyd <david.lloyd at redhat.com>
Date:   Thu Oct 18 15:56:37 2018 -0500

    [JDK-6850720] Enable POSIX_SPAWN as an option for child process
creation on Linux

diff --git a/make/launcher/Launcher-java.base.gmk
b/make/launcher/Launcher-java.base.gmk
index 0ce0287d2be..c28fe42d102 100644
--- a/make/launcher/Launcher-java.base.gmk
+++ b/make/launcher/Launcher-java.base.gmk
@@ -84,7 +84,7 @@ endif

 ################################################################################

-ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx solaris aix), )
+ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx solaris aix linux), )
   $(eval $(call SetupJdkExecutable, BUILD_JSPAWNHELPER, \
       NAME := jspawnhelper, \
       SRC := $(TOPDIR)/src/$(MODULE)/unix/native/jspawnhelper, \
diff --git a/src/java.base/unix/classes/java/lang/ProcessImpl.java
b/src/java.base/unix/classes/java/lang/ProcessImpl.java
index 368a4f7380b..959e50dfecd 100644
--- a/src/java.base/unix/classes/java/lang/ProcessImpl.java
+++ b/src/java.base/unix/classes/java/lang/ProcessImpl.java
@@ -89,7 +89,7 @@ final class ProcessImpl extends Process {

     private static enum Platform {

-        LINUX(LaunchMechanism.VFORK, LaunchMechanism.FORK),
+        LINUX(LaunchMechanism.VFORK, LaunchMechanism.POSIX_SPAWN,
LaunchMechanism.FORK),

         BSD(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK),

diff --git a/src/java.base/unix/native/libjava/ProcessImpl_md.c
b/src/java.base/unix/native/libjava/ProcessImpl_md.c
index 533584fdb7a..6869a64f2cc 100644
--- a/src/java.base/unix/native/libjava/ProcessImpl_md.c
+++ b/src/java.base/unix/native/libjava/ProcessImpl_md.c
@@ -44,7 +44,7 @@
 #include <signal.h>
 #include <string.h>

-#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX)
+#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX)
|| defined(__linux__)
 #include <spawn.h>
 #endif

@@ -390,7 +390,7 @@ forkChild(ChildStuff *c) {
     return resultPid;
 }

-#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX)
+#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX)
|| defined(__linux__)
 static pid_t
 spawnChild(JNIEnv *env, jobject process, ChildStuff *c, const char
*helperpath) {
     pid_t resultPid;
@@ -489,7 +489,7 @@ startChild(JNIEnv *env, jobject process,
ChildStuff *c, const char *helperpath)
 #endif
       case MODE_FORK:
         return forkChild(c);
-#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX)
+#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX)
|| defined(__linux__)
       case MODE_POSIX_SPAWN:
         return spawnChild(env, process, c, helperpath);
 #endif


More information about the core-libs-dev mailing list