6850720: Allow POSIX_SPAWN to be used for ProcessImpl on Linux (original) (raw)

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(eval (eval(call SetupJdkExecutable, BUILD_JSPAWNHELPER,
NAME := jspawnhelper,
SRC := (TOPDIR)/src/(TOPDIR)/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 {

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