Date: Thu, 23 Oct 2003 12:48:36 +0200 From: "Remco van 't Veer" <rwvtveer@xs4all.nl> To: Alexey Zelkin <phantom@FreeBSD.org.ua> Cc: java@freebsd.org Subject: Re: jdk14 fork() problem fix Message-ID: <20031023104836.GB7723@azrael.xs4all.nl> In-Reply-To: <20031023122839.A75570@phantom.cris.net> References: <20031023122839.A75570@phantom.cris.net>
next in thread | previous in thread | raw e-mail | index | archive | help
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@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-java > To unsubscribe, send any mail to "freebsd-java-unsubscribe@freebsd.org" --
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20031023104836.GB7723>