jdk14 fork() problem fix

Roberto de Iriarte rdeiriar at spock.cl
Sat Oct 25 14:12:27 PDT 2003


[Crossposted to freebsd-mozilla at freebsd.org and freebsd-java at freebsd.org]

I have experienced a similar problem when running 
flashpluginwrapper-20031006
(A wrapper libraryto allow the linux plugin for Macromedia Flash to
be used with native mozilla), as well as the native 1.4.1 patchlevel 4
plugin with Mozlla, with libc_r (The problem does not manifest itself
under 5-CURRENT with libkse).
I've been unable to reproduce the bug with your patch applied,

Regards and thanks for  everything.

Roberto.
 
Alexey Zelkin wrote:

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];
>>>> > > _______________________________________________
>>>




More information about the freebsd-mozilla mailing list