diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-05-27 16:55:39 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-05-27 16:55:39 +0000 |
commit | 432b4d03ad0f23970315e9f9dec080ab4a9ab94b (patch) | |
tree | dca5dae7862561846b88a6eb4f7bcfb562685d46 /gdb/testsuite | |
parent | b0f260d61e5b5b3de1fcac6042f4b225bf132d45 (diff) | |
download | gdb-432b4d03ad0f23970315e9f9dec080ab4a9ab94b.zip gdb-432b4d03ad0f23970315e9f9dec080ab4a9ab94b.tar.gz gdb-432b4d03ad0f23970315e9f9dec080ab4a9ab94b.tar.bz2 |
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.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/leader-exit.c | 49 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/leader-exit.exp | 38 |
3 files changed, 92 insertions, 0 deletions
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 <jan.kratochvil@redhat.com> + + * gdb.threads/leader-exit.c: New file. + * gdb.threads/leader-exit.exp: New file. + 2011-05-27 Marek Polacek <mpolacek@redhat.com> * 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 <http://www.gnu.org/licenses/>. */ + +#include <pthread.h> +#include <assert.h> +#include <unistd.h> + +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 <http://www.gnu.org/licenses/>. + +# 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" |