Date: Tue, 19 Apr 2011 12:53:54 -0400 From: Ryan Stone <rysto32@gmail.com> To: FreeBSD Current <freebsd-current@freebsd.org> Cc: Ed Maste <emaste@freebsd.org>, davidxu@freebsd.org Subject: [PATCH] Call _thr_check_init() from _pthread_once Message-ID: <BANLkTikwT0qOB32DeLMdFkx4vkx6_HAkQg@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
In r179417 the implementation of pthread_once in libthr was changed
from using a global pthread_mutex_t for synchronization to rolling its
own synchronization mechanism. Unfortunately, this introduced a bug.
Calling _pthread_mutex_lock implicitly ensured that _thr_check_init()
had been called. In the current version, there is no such guarantee.
This means that if your first call into libthr is pthread_once, your
executable will segfault when it tries to access curthread. This
patch resolves the issue for me:
Index: lib/libthr/thread/thr_once.c
===================================================================
--- lib/libthr/thread/thr_once.c (revision 220603)
+++ lib/libthr/thread/thr_once.c (working copy)
@@ -64,6 +64,8 @@
struct pthread *curthread;
int state;
+ _thr_check_init();
+
for (;;) {
state = once_control->state;
if (state == ONCE_DONE)
If there are no objections I'll commit this soon.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BANLkTikwT0qOB32DeLMdFkx4vkx6_HAkQg>
