Fixes for very early use of the pthread_mutex_* and libthr malloc.
When libthr is statically linked into the binary, order of the constructors execution is not deterministic. It is possible for the application constructor to use pthread_mutex_* functions before the libthr initialization was done. Handle it by: - making thr_malloc.c locking functions operational when curthread is not yet set; - making __thr_malloc_init() idempotent, allowing more than one call to it; - unconditionally calling __thr_malloc_init() before initializing a process-private mutex. Reported and tested by: mmel Sponsored by: The FreeBSD Foundation MFC after: 1 week
This commit is contained in:
parent
bfce461ee9
commit
e4314da2e4
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=343754
@ -46,6 +46,8 @@ void
|
|||||||
__thr_malloc_init(void)
|
__thr_malloc_init(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (npagesizes != 0)
|
||||||
|
return;
|
||||||
npagesizes = getpagesizes(pagesizes_d, nitems(pagesizes_d));
|
npagesizes = getpagesizes(pagesizes_d, nitems(pagesizes_d));
|
||||||
if (npagesizes == -1) {
|
if (npagesizes == -1) {
|
||||||
npagesizes = 1;
|
npagesizes = 1;
|
||||||
@ -59,6 +61,8 @@ static void
|
|||||||
thr_malloc_lock(struct pthread *curthread)
|
thr_malloc_lock(struct pthread *curthread)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (curthread == NULL)
|
||||||
|
return;
|
||||||
curthread->locklevel++;
|
curthread->locklevel++;
|
||||||
_thr_umutex_lock(&thr_malloc_umtx, TID(curthread));
|
_thr_umutex_lock(&thr_malloc_umtx, TID(curthread));
|
||||||
}
|
}
|
||||||
@ -67,6 +71,8 @@ static void
|
|||||||
thr_malloc_unlock(struct pthread *curthread)
|
thr_malloc_unlock(struct pthread *curthread)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (curthread == NULL)
|
||||||
|
return;
|
||||||
_thr_umutex_unlock(&thr_malloc_umtx, TID(curthread));
|
_thr_umutex_unlock(&thr_malloc_umtx, TID(curthread));
|
||||||
curthread->locklevel--;
|
curthread->locklevel--;
|
||||||
_thr_ast(curthread);
|
_thr_ast(curthread);
|
||||||
|
@ -390,6 +390,7 @@ __pthread_mutex_init(pthread_mutex_t * __restrict mutex,
|
|||||||
}
|
}
|
||||||
if (mutex_attr == NULL ||
|
if (mutex_attr == NULL ||
|
||||||
(*mutex_attr)->m_pshared == PTHREAD_PROCESS_PRIVATE) {
|
(*mutex_attr)->m_pshared == PTHREAD_PROCESS_PRIVATE) {
|
||||||
|
__thr_malloc_init();
|
||||||
return (mutex_init(mutex, mutex_attr ? *mutex_attr : NULL,
|
return (mutex_init(mutex, mutex_attr ? *mutex_attr : NULL,
|
||||||
__thr_calloc));
|
__thr_calloc));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user