threaded, forked, rethreaded processes will deadlock

David Xu davidxu at freebsd.org
Wed Mar 18 20:58:07 PDT 2009


Kostik Belousov wrote:
> I looked at the issue once more recently, and I propose the following
> much less intrusive patch. It is somewhat hackish, but I think that
> it would be good to have this working. Most other Unixes do have
> working thread library after the fork. Any objections ?
> 
> diff --git a/lib/libthr/thread/thr_fork.c b/lib/libthr/thread/thr_fork.c
> index bc410d1..ae6b9ad 100644
> --- a/lib/libthr/thread/thr_fork.c
> +++ b/lib/libthr/thread/thr_fork.c
> @@ -173,14 +173,19 @@ _fork(void)
>  		/* Ready to continue, unblock signals. */ 
>  		_thr_signal_unblock(curthread);
>  
> -		if (unlock_malloc)
> +		if (unlock_malloc) {
> +			__isthreaded = 1;
>  			_malloc_postfork();
> +			__isthreaded = 0;
> +		}
>  
>  		/* Run down atfork child handlers. */
>  		TAILQ_FOREACH(af, &_thr_atfork_list, qe) {
>  			if (af->child != NULL)
>  				af->child();
>  		}
> +
> +		THR_UMUTEX_UNLOCK(curthread, &_thr_atfork_lock);

^^^
This line is not needed.

>  	} else {
>  		/* Parent process */
>  		errsave = errno;





More information about the freebsd-hackers mailing list