jdk14 fork() problem fix
Alexey Zelkin
phantom at FreeBSD.org.ua
Sat Oct 25 10:31:07 PDT 2003
hi,
On Sat, Oct 25, 2003 at 06:01:03PM +0200, Remco van 't Veer wrote:
> 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. ;)
If problem persist then you'll notice processes which eats much
of system time and not exiting without SIGKILL.
> 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?
No. This problem is libc_r specific.
> Anyway, I am really happy with this patch and hope it will be
> included in the next version. Thank you for your fantastic work.
Sure.
Thank you for report!
> 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