r179417 introduced a bug into pthread_once(). Previously pthread_once()

used a global pthread_mutex_t for synchronization.  r179417 replaced that
with an implementation that directly used atomic instructions and thr_*
syscalls to synchronize callers to pthread_once.  However, calling
pthread_mutex_lock on the global mutex implicitly ensured that
_thr_check_init() had been called but with r179417 this was no longer
guaranteed.  This meant that if you were unlucky enough to have your first
call into libthr be a call to pthread_once(), you would segfault when
trying to access the pointer returned by _get_curthread().

The fix is to explicitly call _thr_check_init() from pthread_once().

Reviewed by:	davidxu
Approved by:	emaste (mentor)
MFC after:	1 week
This commit is contained in:
Ryan Stone 2011-04-20 14:19:34 +00:00
parent d17d64c4bf
commit aad93b043a

View File

@ -64,6 +64,8 @@ _pthread_once(pthread_once_t *once_control, void (*init_routine) (void))
struct pthread *curthread;
int state;
_thr_check_init();
for (;;) {
state = once_control->state;
if (state == ONCE_DONE)