diff options
-rw-r--r-- | gdb/testsuite/ChangeLog | 14 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/ia64-sigill.c | 11 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/siginfo-threads.c | 13 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/watchthreads-reorder.c | 13 |
4 files changed, 51 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 77758f1..cd38459 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,19 @@ 2015-01-09 Pedro Alves <palves@redhat.com> + * gdb.threads/ia64-sigill.c (threads_started_barrier): New global. + (thread_func): Wait on barrier. + (main): Wait for all threads to start before stopping GDB. + * gdb.threads/siginfo-threads.c (threads_started_barrier): New + global. + (thread1_func, thread2_func): Wait on barrier. + (main): Wait for all threads to start before stopping GDB. + * gdb.threads/watchthreads-reorder.c (threads_started_barrier): + New global. + (thread1_func, thread2_func): Wait on barrier. + (main): Wait for all threads to start before stopping GDB. + +2015-01-09 Pedro Alves <palves@redhat.com> + * gdb.threads/attach-many-short-lived-threads.c: New file. * gdb.threads/attach-many-short-lived-threads.exp: New file. diff --git a/gdb/testsuite/gdb.threads/ia64-sigill.c b/gdb/testsuite/gdb.threads/ia64-sigill.c index 6af0138..11782fa 100644 --- a/gdb/testsuite/gdb.threads/ia64-sigill.c +++ b/gdb/testsuite/gdb.threads/ia64-sigill.c @@ -44,6 +44,8 @@ static pthread_mutex_t thread2_tid_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_ static pthread_mutex_t terminate_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; +static pthread_barrier_t threads_started_barrier; + /* Do not use alarm as it would create a ptrace event which would hang up us if we are being traced by GDB which we stopped ourselves. */ @@ -78,6 +80,8 @@ thread_func (void *threadno_voidp) int threadno = (intptr_t) threadno_voidp; int i; + pthread_barrier_wait (&threads_started_barrier); + switch (threadno) { case 1: @@ -272,6 +276,8 @@ main (int argc, char **argv) timed_mutex_lock (&terminate_mutex); + pthread_barrier_init (&threads_started_barrier, NULL, 3); + i = pthread_create (&thread1, NULL, thread_func, (void *) (intptr_t) 1); assert (i == 0); @@ -298,6 +304,11 @@ main (int argc, char **argv) atexit (cleanup); + /* Wait until all threads are seen running. On Linux (at least), + new threads start stopped, and the debugger must resume them. + Need to wait for that before stopping GDB. */ + pthread_barrier_wait (&threads_started_barrier); + printf ("Stopping GDB PID %lu.\n", (unsigned long) tracer); if (tracer) diff --git a/gdb/testsuite/gdb.threads/siginfo-threads.c b/gdb/testsuite/gdb.threads/siginfo-threads.c index 95c3927..a8e5446 100644 --- a/gdb/testsuite/gdb.threads/siginfo-threads.c +++ b/gdb/testsuite/gdb.threads/siginfo-threads.c @@ -54,6 +54,8 @@ static int thread2_sigusr2_hit; static pthread_mutex_t terminate_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; +static pthread_barrier_t threads_started_barrier; + /* Do not use alarm as it would create a ptrace event which would hang us up if we are being traced by GDB, which we stopped ourselves. */ @@ -128,6 +130,8 @@ thread1_func (void *unused) { int i; + pthread_barrier_wait (&threads_started_barrier); + timed_mutex_lock (&thread1_tid_mutex); /* THREAD1_TID_MUTEX must be already locked to avoid a race. */ @@ -163,6 +167,8 @@ thread2_func (void *unused) { int i; + pthread_barrier_wait (&threads_started_barrier); + timed_mutex_lock (&thread2_tid_mutex); /* THREAD2_TID_MUTEX must be already locked to avoid a race. */ @@ -354,6 +360,8 @@ main (int argc, char **argv) assert_perror (errno); assert (i == 0); + pthread_barrier_init (&threads_started_barrier, NULL, 3); + i = pthread_create (&thread1, NULL, thread1_func, NULL); assert (i == 0); @@ -380,6 +388,11 @@ main (int argc, char **argv) atexit (cleanup); + /* Wait until all threads are seen running. On Linux (at least), + new threads start stopped, and the debugger must resume them. + Need to wait for that before stopping GDB. */ + pthread_barrier_wait (&threads_started_barrier); + printf ("Stopping GDB PID %lu.\n", (unsigned long) tracer); if (tracer) diff --git a/gdb/testsuite/gdb.threads/watchthreads-reorder.c b/gdb/testsuite/gdb.threads/watchthreads-reorder.c index 353b4a1..b28a0de 100644 --- a/gdb/testsuite/gdb.threads/watchthreads-reorder.c +++ b/gdb/testsuite/gdb.threads/watchthreads-reorder.c @@ -44,6 +44,8 @@ static pthread_mutex_t thread2_tid_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_ static pthread_mutex_t terminate_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; +static pthread_barrier_t threads_started_barrier; + /* These variables must have lower in-memory addresses than thread1_rwatch and thread2_rwatch so that they take their watchpoint slots. */ @@ -87,6 +89,8 @@ thread1_func (void *unused) int i; volatile int rwatch_store; + pthread_barrier_wait (&threads_started_barrier); + timed_mutex_lock (&thread1_tid_mutex); /* THREAD1_TID_MUTEX must be already locked to avoid race. */ @@ -113,6 +117,8 @@ thread2_func (void *unused) int i; volatile int rwatch_store; + pthread_barrier_wait (&threads_started_barrier); + timed_mutex_lock (&thread2_tid_mutex); /* THREAD2_TID_MUTEX must be already locked to avoid race. */ @@ -279,6 +285,8 @@ main (int argc, char **argv) timed_mutex_lock (&terminate_mutex); + pthread_barrier_init (&threads_started_barrier, NULL, 3); + i = pthread_create (&thread1, NULL, thread1_func, NULL); assert (i == 0); @@ -305,6 +313,11 @@ main (int argc, char **argv) atexit (cleanup); + /* Wait until all threads are seen running. On Linux (at least), + new threads start stopped, and the debugger must resume them. + Need to wait for that before stopping GDB. */ + pthread_barrier_wait (&threads_started_barrier); + printf ("Stopping GDB PID %lu.\n", (unsigned long) tracer); if (tracer) |