Files
binutils-gdb/gdb/testsuite/gdb.python/py-thread-exited.c
Andrew Burgess a345d14fa6 gdb/testsuite: fix race condition in gdb.python/py-thread-exited.exp
I ran into a test failure on gdb.python/py-thread-exited.c.  The test
creates two threads and then catches the thread exits in Python.  The
test expects the threads to exit in a specific order.

As the test is currently written, it is _likely_, but not guaranteed,
that the threads will exit in the same order they are created, which
is what the test expects.

When running on a loaded system I ran into a case where the threads
exited in the reverse creation order, which caused the test to fail.

I could fix this by having the .exp file not care about the thread
order, or by changing the C file to force the order. I chose the
later, and added a pthread_barrier_t to ensure the threads exit in the
correct order.

There should be no change in what is tested after this commit.
2023-08-16 15:03:56 +01:00

49 lines
1.5 KiB
C

/* This testcase is part of GDB, the GNU debugger.
Copyright 2022-2023 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>
pthread_t thread2_id;
pthread_t thread3_id;
void* do_thread (void* d)
{
if (d != NULL)
{
pthread_barrier_t *barrier = (pthread_barrier_t *) d;
pthread_barrier_wait (barrier);
}
return NULL; /* In thread */
}
int main (void)
{
/* We want the threads to exit in a known order. Use a barrier to ensure
the second thread doesn't exit until the first has been joined. */
pthread_barrier_t barrier;
pthread_barrier_init (&barrier, NULL, 2);
pthread_create (&thread2_id, NULL, do_thread, NULL);
pthread_create (&thread3_id, NULL, do_thread, &barrier);
pthread_join (thread2_id, NULL);
pthread_barrier_wait (&barrier);
pthread_join (thread3_id, NULL);
return 12; /* Done */
}