mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-11 20:00:07 +00:00
test-dlclose-exit-race: avoid hang on pthread_create error
This test depends on the "last" function being called in a different thread than the "first" function, as "last" posts a semaphore that "first" is waiting on. However, if pthread_create fails - for example, if running in an older container before the clone3()-in-container-EPERM fixes - exit() is called in the same thread as everything else, the semaphore never gets posted, and first hangs. The fix is to pre-post that semaphore before a single-threaded exit. Reviewed-by: Arjun Shankar <arjun@redhat.com>
This commit is contained in:
parent
b17e842a60
commit
ac30324c67
@ -29,6 +29,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <semaphore.h>
|
||||
#include <support/check.h>
|
||||
#include <support/xdlfcn.h>
|
||||
@ -64,6 +65,7 @@ last (void)
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
int value;
|
||||
void *dso;
|
||||
pthread_t thread;
|
||||
|
||||
@ -71,7 +73,17 @@ main (void)
|
||||
|
||||
dso = xdlopen ("$ORIGIN/test-dlclose-exit-race-helper.so",
|
||||
RTLD_NOW|RTLD_GLOBAL);
|
||||
thread = xpthread_create (NULL, exit_thread, NULL);
|
||||
if ((value = pthread_create (&thread, NULL, exit_thread, NULL)) != 0)
|
||||
{
|
||||
/* If pthread_create fails, then exit() is called in the main
|
||||
thread instead of a second thread, so the semaphore post that
|
||||
would have happened in 'last' gets blocked behind the call to
|
||||
first() - which is waiting on the semaphore, and thus
|
||||
hangs. */
|
||||
sem_post (&order2);
|
||||
errno = value;
|
||||
FAIL_EXIT1 ("pthread_create: %m");
|
||||
}
|
||||
|
||||
xdlclose (dso);
|
||||
xpthread_join (thread);
|
||||
|
Loading…
Reference in New Issue
Block a user