Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Oct 2003 12:48:36 +0200
From:      "Remco van 't Veer" <rwvtveer@xs4all.nl>
To:        Alexey Zelkin <phantom@FreeBSD.org.ua>
Cc:        java@freebsd.org
Subject:   Re: jdk14 fork() problem fix
Message-ID:  <20031023104836.GB7723@azrael.xs4all.nl>
In-Reply-To: <20031023122839.A75570@phantom.cris.net>
References:  <20031023122839.A75570@phantom.cris.net>

next in thread | previous in thread | raw e-mail | index | archive | help
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"

-- 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20031023104836.GB7723>