]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
r179417 introduced a bug into pthread_once(). Previously pthread_once()
authorrstone <rstone@FreeBSD.org>
Wed, 20 Apr 2011 14:19:34 +0000 (14:19 +0000)
committerrstone <rstone@FreeBSD.org>
Wed, 20 Apr 2011 14:19:34 +0000 (14:19 +0000)
commit488ea46b7d7c71796ada53fa9457888744b9ee6d
tree4ada84d5c8d0de23e04b6a39d2b43f9b5dcf345a
parent738b0a175176f8de0bd0fce5baa1460e18c1708a
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
lib/libthr/thread/thr_once.c