[COMMITTED] Fix set up of queue-signal.exp test.

Message ID m31treqd9g.fsf@sspiff.org
State Committed
Headers

Commit Message

Doug Evans Sept. 14, 2014, 6:15 p.m. UTC
  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.
  

Patch

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);