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-java
mailing list