This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[COMMITTED PATCH] Fix set up of queue-signal.exp test.
- From: Doug Evans <xdje42 at gmail dot com>
- To: gdb-patches at sourceware dot org
- Date: Sun, 14 Sep 2014 11:15:55 -0700
- Subject: [COMMITTED PATCH] Fix set up of queue-signal.exp test.
- Authentication-results: sourceware.org; auth=none
Hi.
I started out on the right path and then oversimplified.
2014-09-14 Doug Evans <xdje42@gmail.com>
* gdb.threads/queue-signal.c (thread_count): New variable.
(thread_count_mutex, thread_count_condvar): New variables.
(incr_thread_count, wait_all_threads_running): New functions.
(main): Wait for all threads to be in their thread functions.
diff --git a/gdb/testsuite/gdb.threads/queue-signal.c b/gdb/testsuite/gdb.threads/queue-signal.c
index 147f2f7..0d3126e 100644
--- a/gdb/testsuite/gdb.threads/queue-signal.c
+++ b/gdb/testsuite/gdb.threads/queue-signal.c
@@ -27,6 +27,20 @@ sig_atomic_t sigusr1_received;
sig_atomic_t sigusr2_received;
sig_atomic_t sigabrt_received;
+/* Number of threads currently running. */
+int thread_count;
+pthread_mutex_t thread_count_mutex;
+pthread_cond_t thread_count_condvar;
+
+static void
+incr_thread_count (void)
+{
+ pthread_mutex_lock (&thread_count_mutex);
+ ++thread_count;
+ pthread_cond_signal (&thread_count_condvar);
+ pthread_mutex_unlock (&thread_count_mutex);
+}
+
static void
sigusr1_handler (int sig)
{
@@ -48,6 +62,7 @@ sigabrt_handler (int sig)
static void *
sigusr1_thread_function (void *unused)
{
+ incr_thread_count ();
while (!ready)
usleep (100);
pthread_kill (pthread_self (), SIGUSR1);
@@ -56,11 +71,31 @@ sigusr1_thread_function (void *unused)
static void *
sigusr2_thread_function (void *unused)
{
+ incr_thread_count ();
while (!ready)
usleep (100);
/* pthread_kill (pthread_self (), SIGUSR2); - manually injected by gdb */
}
+/* Wait until all threads are at a point where a backtrace will
+ show the main thread function. */
+
+static void
+wait_all_threads_running (int nr_threads)
+{
+ pthread_mutex_lock (&thread_count_mutex);
+
+ while (1)
+ {
+ if (thread_count == nr_threads)
+ {
+ pthread_mutex_unlock (&thread_count_mutex);
+ return;
+ }
+ pthread_cond_wait (&thread_count_condvar, &thread_count_mutex);
+ }
+}
+
static void
all_threads_running (void)
{
@@ -88,8 +123,13 @@ main ()
/* Don't let any thread advance past initialization. */
ready = 0;
+ pthread_mutex_init (&thread_count_mutex, NULL);
+ pthread_cond_init (&thread_count_condvar, NULL);
+
+#define NR_THREADS 2
pthread_create (&sigusr1_thread, NULL, sigusr1_thread_function, NULL);
pthread_create (&sigusr2_thread, NULL, sigusr2_thread_function, NULL);
+ wait_all_threads_running (NR_THREADS);
all_threads_running ();
pthread_kill (pthread_self (), SIGABRT);