jdk14 fork() problem fix
Remco van 't Veer
rwvtveer at xs4all.nl
Thu Oct 23 03:49:00 PDT 2003
Thanx! I have a new compile running right now. It will take
more than 10 hours to finish on my poor P3 so I hope to have some
test results for you tomorrow.
Remco
On Thu, Oct 23, 2003 at 12:28, Alexey Zelkin wrote:
> 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];
> _______________________________________________
> freebsd-java at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-java
> To unsubscribe, send any mail to "freebsd-java-unsubscribe at freebsd.org"
--
More information about the freebsd-java
mailing list