Date: Thu, 23 Oct 2003 12:28:39 +0300 From: Alexey Zelkin <phantom@FreeBSD.org.ua> To: java@freebsd.org Subject: jdk14 fork() problem fix Message-ID: <20031023122839.A75570@phantom.cris.net>
next in thread | raw e-mail | index | archive | help
hi, This is an intermediate version of fix of jdk fork problem (i.e. Runtime.getRuntime().exec() and friends). It does affect only people who use libc_r (kse and thr should not be affected). Please try this one and report me if it fixes problems for you. PS: If you are rebuilding already built jdk (i.e. object files are already compiled) remove 'control/build/bsd-i586/tmp/java/java.lang' directory before restarting of build. Index: UNIXProcess_md.c.bsd =================================================================== RCS file: /home/jdk14-cvs/jdk142-src/j2se/src/solaris/native/java/lang/UNIXProcess_md.c.bsd,v retrieving revision 1.2 diff -u -r1.2 UNIXProcess_md.c.bsd --- UNIXProcess_md.c.bsd 15 Oct 2003 15:49:39 -0000 1.2 +++ UNIXProcess_md.c.bsd 23 Oct 2003 10:20:48 -0000 @@ -22,6 +22,12 @@ #include <errno.h> #include <unistd.h> +#if defined(__FreeBSD__) +#include <dlfcn.h> +#include <pthread.h> +#include <pthread_np.h> +#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];
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20031023122839.A75570>