diff --git a/gdb/testsuite/gdb.threads/clone-new-thread-event.c b/gdb/testsuite/gdb.threads/clone-new-thread-event.c index 800514d0b6d..9e7ceb97a65 100644 --- a/gdb/testsuite/gdb.threads/clone-new-thread-event.c +++ b/gdb/testsuite/gdb.threads/clone-new-thread-event.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #ifdef __UCLIBC__ @@ -59,7 +60,7 @@ int main (int argc, char **argv) { unsigned char *stack; - int new_pid; + int new_pid, status, ret; stack = malloc (STACK_SIZE); assert (stack != NULL); @@ -71,5 +72,18 @@ main (int argc, char **argv) , NULL, NULL, NULL, NULL); assert (new_pid > 0); + /* Note the clone call above didn't use CLONE_THREAD, so it actually + put the new thread in a new thread group. However, the new clone + is still reported with PTRACE_EVENT_CLONE to GDB, since we didn't + use CLONE_VFORK (results in PTRACE_EVENT_VFORK) nor set the + termination signal to SIGCHLD (results in PTRACE_EVENT_FORK), so + GDB thinks of it as a new thread of the same inferior. It's a + bit of an odd setup, but it's not important for what we're + testing, and, it let's us conveniently use waitpid to wait for + the clone, which you can't with CLONE_THREAD. */ + ret = waitpid (new_pid, &status, __WALL); + assert (ret == new_pid); + assert (WIFSIGNALED (status) && WTERMSIG (status) == SIGUSR1); + return 0; } diff --git a/gdb/testsuite/gdb.threads/clone-new-thread-event.exp b/gdb/testsuite/gdb.threads/clone-new-thread-event.exp index fdebd488d8a..db5ae39aded 100644 --- a/gdb/testsuite/gdb.threads/clone-new-thread-event.exp +++ b/gdb/testsuite/gdb.threads/clone-new-thread-event.exp @@ -31,3 +31,5 @@ if { ![runto_main] } { gdb_test "continue" \ "Thread 2 received signal SIGUSR1, User defined signal 1.*" \ "catch SIGUSR1" + +gdb_continue_to_end "" continue 1