Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Oct 2003 20:40:29 +0300
From:      Alexey Zelkin <phantom@FreeBSD.org.ua>
To:        "Remco van 't Veer" <rwvtveer@xs4all.nl>
Cc:        java@freebsd.org
Subject:   Re: jdk14 fork() problem fix
Message-ID:  <20031025204029.A2230@phantom.cris.net>
In-Reply-To: <20031025160103.GC7723@azrael.xs4all.nl>; from rwvtveer@xs4all.nl on Sat, Oct 25, 2003 at 06:01:03PM %2B0200
References:  <20031023122839.A75570@phantom.cris.net> <20031023104836.GB7723@azrael.xs4all.nl> <20031025160103.GC7723@azrael.xs4all.nl>

next in thread | previous in thread | raw e-mail | index | archive | help
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@freebsd.org mailing list
> > > http://lists.freebsd.org/mailman/listinfo/freebsd-java
> > > To unsubscribe, send any mail to "freebsd-java-unsubscribe@freebsd.org"
> > 
> > -- 
> > _______________________________________________
> > 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?20031025204029.A2230>