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:
parent
d17d64c4bf
commit
aad93b043a
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user