jdk14 fork() problem fix
Remco van 't Veer
rwvtveer at xs4all.nl
Sat Oct 25 09:01:33 PDT 2003
Hi,
I've been running ant (with external processes like jikes and
javadoc), compiling jsps and doing other stuff which fork
processes with a jvm including your patch but I can't reproduce
to problem. This ofcourse only proves my inability to repeat
this bug and not that the problem has been fixed.. The hanging
processes actually happend quiet often so I can say is much
harder to reproduce. ;)
I ran these tests on my FreeBSD 4.8 system. Does you remark
about kse and thr mean this problem does not occure on systems
using these technologies?
Anyway, I am really happy with this patch and hope it will be
included in the next version. Thank you for your fantastic work.
Remco
On Thu, Oct 23, 2003 at 12:48, Remco van 't Veer wrote:
> 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"
>
> --
> _______________________________________________
> 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