From 7d2d0599c7d330076529d5cd10cfe77d7c87a66a Mon Sep 17 00:00:00 2001 From: Alexey Zelkin Date: Wed, 29 Oct 2003 08:20:59 +0000 Subject: . Add fix for "runaway process" problem. It should fix of stalled processes problem for people who use Runtime.getRuntime.exec() method and related things. Least five people reported that this patch fixed problem for them. IMPORTANT: I'd also suggested to all jdk14 users who runs FreeBSD 4.x and use libc_r at FreeBSD 5.x to upgrade. . Stop removing "src.zip" from installation bundle. Since -p4 it builds correctly and there's no reason to forbit people to use it. . Bump PORTREVISION. --- java/jdk14/files/patch-UNIXProcess_md.c.bsd | 93 +++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 java/jdk14/files/patch-UNIXProcess_md.c.bsd (limited to 'java/jdk14/files/patch-UNIXProcess_md.c.bsd') diff --git a/java/jdk14/files/patch-UNIXProcess_md.c.bsd b/java/jdk14/files/patch-UNIXProcess_md.c.bsd new file mode 100644 index 000000000000..d9ec95eefa7c --- /dev/null +++ b/java/jdk14/files/patch-UNIXProcess_md.c.bsd @@ -0,0 +1,93 @@ +$FreeBSD$ + +--- ../../j2se/src/solaris/native/java/lang/UNIXProcess_md.c.bsd.orig Wed Oct 29 12:22:58 2003 ++++ ../../j2se/src/solaris/native/java/lang/UNIXProcess_md.c.bsd Wed Oct 29 12:23:33 2003 +@@ -22,6 +22,12 @@ + #include + #include + ++#if defined(__FreeBSD__) ++#include ++#include ++#include ++#endif ++ + /* path in the environment */ + static char **PATH = 0; + /* effective uid */ +@@ -228,6 +234,61 @@ + } + } + ++#if defined(__FreeBSD__) ++ ++extern pid_t __sys_fork(void); ++ ++static pid_t ++jdk_fork_wrapper() ++{ ++ pid_t resultPid; ++#if (__FreeBSD_version < 5) ++ static int is_libc_r = -1; ++ void *funcref; ++ ++ if (is_libc_r == -1) { ++ is_libc_r = 1; ++ ++ /* ++ * BSDNOTE: Check for loaded symbols. ++ * ++ * If "_thr_critical_enter" is found assume we are using 'libthr'. ++ * If _kse_critical_enter is found assume we are using 'libkse'. ++ * Otherwise we are using libc_r. ++ * ++ * If libc_r is loaded, use fork system call drectly to avoid ++ * problems with using protected pages. ++ * ++ * --phantom ++ */ ++ funcref = dlsym(RTLD_DEFAULT, "_kse_critical_enter"); ++ if (funcref != NULL) ++ is_libc_r = 0; ++ else { ++ funcref = dlsym(RTLD_DEFAULT, "_thr_critical_enter"); ++ if (funcref != NULL) ++ is_libc_r = 0; ++ } ++ } ++ ++ if (is_libc_r == 0) { ++ /* Not a libc_r */ ++ resultPid = fork(); ++ } else { ++#endif /* __FreeBSD_version < 5 */ ++ pthread_suspend_all_np(); ++ resultPid = __sys_fork(); ++ if (resultPid != 0) ++ /* leave child in single threading mode */ ++ pthread_resume_all_np(); ++#if (__FreeBSD_version < 5) ++ } ++#endif /* __FreeBSD_version < 5 */ ++ ++ return resultPid; ++} ++#endif /* __FreeBSD__ */ ++ + JNIEXPORT jint JNICALL + Java_java_lang_UNIXProcess_forkAndExec(JNIEnv *env, + jobject process, +@@ -335,8 +396,12 @@ + if (path != NULL) { + cwd = (char *)JNU_GetStringPlatformChars(env, path, NULL); + } +- ++ ++#if defined(__FreeBSD__) ++ resultPid = jdk_fork_wrapper(); ++#else + resultPid = fork(); ++#endif + + if (resultPid < 0) { + char errmsg[128]; -- cgit v1.2.3