Re: Fatal error 'mutex is on list' at line 139 in file /usr/src/lib/libthr/thread/thr_mutex.c (errno = 35)

From: Konstantin Belousov <kostikbel_at_gmail.com>
Date: Fri, 18 Mar 2016 11:55:31 +0200
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.

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
_at__at_ -168,6 +168,7 _at__at_ __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;
_at__at_ -202,8 +203,10 _at__at_ __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. */
_at__at_ -236,6 +239,7 _at__at_ __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
_at__at_ -466,7 +466,6 _at__at_ init_private(void)
 	_thr_once_init();
 	_thr_spinlock_init();
 	_thr_list_init();
-	__thr_pshared_init();
 	_thr_wake_addr_init();
 	_sleepq_init();
 	_single_thread = NULL;
_at__at_ -477,6 +476,7 _at__at_ 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
_at__at_ -952,6 +952,8 _at__at_ 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
_at__at_ -252,3 +252,17 _at__at_ __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);
+}
Received on Fri Mar 18 2016 - 08:55:46 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:03 UTC