From 432b4d03ad0f23970315e9f9dec080ab4a9ab94b Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Fri, 27 May 2011 16:55:39 +0000 Subject: gdb/ Fix PR 10970, PR 12702. * linux-nat.c (linux_lwp_is_zombie): New function. (wait_lwp): Initialize status. New variable prev_mask. Block signals. Check for linux_lwp_is_zombie. Use WNOHANG and sigsuspend. gdb/testsuite/ * gdb.threads/leader-exit.c: New file. * gdb.threads/leader-exit.exp: New file. --- gdb/testsuite/ChangeLog | 5 ++++ gdb/testsuite/gdb.threads/leader-exit.c | 49 +++++++++++++++++++++++++++++++ gdb/testsuite/gdb.threads/leader-exit.exp | 38 ++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 gdb/testsuite/gdb.threads/leader-exit.c create mode 100644 gdb/testsuite/gdb.threads/leader-exit.exp (limited to 'gdb/testsuite') diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 6726fb1..cfdf37f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-27 Jan Kratochvil + + * gdb.threads/leader-exit.c: New file. + * gdb.threads/leader-exit.exp: New file. + 2011-05-27 Marek Polacek * gdb.mi/mi-nonstop.exp: Replace gdb_test_multiple with mi_gdb_test. diff --git a/gdb/testsuite/gdb.threads/leader-exit.c b/gdb/testsuite/gdb.threads/leader-exit.c new file mode 100644 index 0000000..a0826bc --- /dev/null +++ b/gdb/testsuite/gdb.threads/leader-exit.c @@ -0,0 +1,49 @@ +/* Clean exit of the thread group leader should not break GDB. + + Copyright 2007, 2011 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 . */ + +#include +#include +#include + +static volatile pthread_t main_thread; + +static void * +start (void *arg) +{ + int i; + + i = pthread_join (main_thread, NULL); + assert (i == 0); + + return arg; /* break-here */ +} + +int +main (void) +{ + pthread_t thread; + int i; + + main_thread = pthread_self (); + + i = pthread_create (&thread, NULL, start, NULL); + assert (i == 0); + + pthread_exit (NULL); + /* NOTREACHED */ + return 0; +} diff --git a/gdb/testsuite/gdb.threads/leader-exit.exp b/gdb/testsuite/gdb.threads/leader-exit.exp new file mode 100644 index 0000000..38303f8 --- /dev/null +++ b/gdb/testsuite/gdb.threads/leader-exit.exp @@ -0,0 +1,38 @@ +# Copyright (C) 2007, 2011 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 . + +# Exit of the thread group leader should not break GDB. + +set testfile "leader-exit" +set srcfile ${testfile}.c +set executable ${testfile} +set binfile ${objdir}/${subdir}/${executable} + +if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + return -1 +} + +clean_restart ${executable} + +if ![runto_main] { + return -1 +} + +gdb_breakpoint [gdb_get_line_number "break-here"] +gdb_continue_to_breakpoint "break-here" ".* break-here .*" + +gdb_test "info threads" \ + "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*" \ + "Single thread has been left" -- cgit v1.1