On Friday 18 March 2016 11:55:31 Konstantin Belousov wrote:
> On Fri, Mar 18, 2016 at 08:14:57AM +0200, Konstantin Belousov wrote:
> > Yes, please.  It would be significantly easier to diagnose the problem if
> > the minimal example is provided.  If not, please pack one crashing app
> > and all it non-system libraries and provide the tarball to me.
> 
> Meantime you could also try the following change.  I doubt that it would
> fix your issue, but it is possibly related.  Only libthr needs to be
> rebuilt.

 I will try it tomorrow morning and will send the report.

Thank you!

> 
> diff --git a/lib/libthr/thread/thr_fork.c b/lib/libthr/thread/thr_fork.c
> index 7256b68..531e09c 100644
> --- a/lib/libthr/thread/thr_fork.c
> +++ b/lib/libthr/thread/thr_fork.c
> @@ -168,6 +168,7 @@ __thr_fork(void)
>       if (_thr_isthreaded() != 0) {
>               was_threaded = 1;
>               _malloc_prefork();
> +             __thr_pshared_atfork_pre();
>               _rtld_atfork_pre(rtld_locks);
>       } else {
>               was_threaded = 0;
> @@ -202,8 +203,10 @@ __thr_fork(void)
> 
>               _thr_signal_postfork_child();
> 
> -             if (was_threaded)
> +             if (was_threaded) {
>                       _rtld_atfork_post(rtld_locks);
> +                     __thr_pshared_atfork_post();
> +             }
>               _thr_setthreaded(0);
> 
>               /* reinitalize library. */
> @@ -236,6 +239,7 @@ __thr_fork(void)
> 
>               if (was_threaded) {
>                       _rtld_atfork_post(rtld_locks);
> +                     __thr_pshared_atfork_post();
>                       _malloc_postfork();
>               }
> 
> diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c
> index 3c81299..5e7f01c 100644
> --- a/lib/libthr/thread/thr_init.c
> +++ b/lib/libthr/thread/thr_init.c
> @@ -466,7 +466,6 @@ init_private(void)
>       _thr_once_init();
>       _thr_spinlock_init();
>       _thr_list_init();
> -     __thr_pshared_init();
>       _thr_wake_addr_init();
>       _sleepq_init();
>       _single_thread = NULL;
> @@ -477,6 +476,7 @@ init_private(void)
>        * e.g. after a fork().
>        */
>       if (init_once == 0) {
> +             __thr_pshared_init();
>               /* Find the stack top */
>               mib[0] = CTL_KERN;
>               mib[1] = KERN_USRSTACK;
> diff --git a/lib/libthr/thread/thr_private.h
> b/lib/libthr/thread/thr_private.h index 31f8e6c..7ee1fbf 100644
> --- a/lib/libthr/thread/thr_private.h
> +++ b/lib/libthr/thread/thr_private.h
> @@ -952,6 +952,8 @@ void      _tcb_dtor(struct tcb *);
>  void __thr_pshared_init(void) __hidden;
>  void *__thr_pshared_offpage(void *key, int doalloc) __hidden;
>  void __thr_pshared_destroy(void *key) __hidden;
> +void __thr_pshared_atfork_pre(void) __hidden;
> +void __thr_pshared_atfork_post(void) __hidden;
> 
>  __END_DECLS
> 
> diff --git a/lib/libthr/thread/thr_pshared.c
> b/lib/libthr/thread/thr_pshared.c index e8ccf1c..8371478 100644
> --- a/lib/libthr/thread/thr_pshared.c
> +++ b/lib/libthr/thread/thr_pshared.c
> @@ -252,3 +252,17 @@ __thr_pshared_destroy(void *key)
>       pshared_clean(key, val);
>       pshared_gc(curthread);
>  }
> +
> +void
> +__thr_pshared_atfork_pre(void)
> +{
> +
> +     _thr_rwl_rdlock(&pshared_lock);
> +}
> +
> +void
> +__thr_pshared_atfork_post(void)
> +{
> +
> +     _thr_rwl_unlock(&pshared_lock);
> +}

_______________________________________________
freebsd-current@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to