diff options
author | Tom Tromey <tromey@redhat.com> | 2012-02-16 14:35:00 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2012-02-16 14:35:00 +0000 |
commit | 9addecb9fb140b0f92a0f06ee90809768bd16eae (patch) | |
tree | f82b5b561c5827241ddb09e7eefd13f1db1fabee | |
parent | bf4c19f73effc1808b4093463e68a7c161b9503a (diff) | |
download | gdb-9addecb9fb140b0f92a0f06ee90809768bd16eae.zip gdb-9addecb9fb140b0f92a0f06ee90809768bd16eae.tar.gz gdb-9addecb9fb140b0f92a0f06ee90809768bd16eae.tar.bz2 |
PR c++/13653:
* thread.c (struct current_thread_cleanup) <was_removable>: New
field.
(do_restore_current_thread_cleanup): Restore 'removable' field.
(restore_current_thread_cleanup_dtor): Likewise.
(make_cleanup_restore_current_thread): Initialize new field.
testsuite/gdb
* gdb.base/inferior-died.c: New file.
* gdb.base/inferior-died.exp: New file.
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/inferior-died.c | 37 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/inferior-died.exp | 56 | ||||
-rw-r--r-- | gdb/thread.c | 8 |
5 files changed, 114 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e04135b..699d12a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2012-02-16 Tom Tromey <tromey@redhat.com> + + PR c++/13653: + * thread.c (struct current_thread_cleanup) <was_removable>: New + field. + (restore_current_thread_cleanup_dtor): Restore 'removable' field. + (make_cleanup_restore_current_thread): Initialize new field. + 2012-02-15 Kevin Buettner <kevinb@redhat.com> * MAINTAINERS: Add rl78 to target ISA section. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ca49415..02c4fc8 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-02-16 Tom Tromey <tromey@redhat.com> + + * gdb.base/inferior-died.c: New file. + * gdb.base/inferior-died.exp: New file. + 2012-02-15 Aleksandar Ristovski <aristovski@qnx.com> * gdb.base/break-inline.exp: New file. diff --git a/gdb/testsuite/gdb.base/inferior-died.c b/gdb/testsuite/gdb.base/inferior-died.c new file mode 100644 index 0000000..66227cf --- /dev/null +++ b/gdb/testsuite/gdb.base/inferior-died.c @@ -0,0 +1,37 @@ +/* Test for fork-related gdb bug + + Copyright 2012 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 <stdlib.h> +#include <stdio.h> +#include <sys/types.h> +#include <unistd.h> + +void function(void) +{ + exit (0); /* Break here */ +} + +int main() +{ + pid_t child = fork (); + + if (child == 0) + function (); + else + waitpid (child, NULL, 0); +} diff --git a/gdb/testsuite/gdb.base/inferior-died.exp b/gdb/testsuite/gdb.base/inferior-died.exp new file mode 100644 index 0000000..458dd61 --- /dev/null +++ b/gdb/testsuite/gdb.base/inferior-died.exp @@ -0,0 +1,56 @@ +# Copyright 2012 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/>. + +if { [is_remote target] || ![isnative] } then { + unsupported "inferior-died.exp" + continue +} + +# Until "set follow-fork-mode" and "catch fork" are implemented on +# other targets... +# +if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-*-linux*"]} then { + unsupported "inferior-died.exp" + continue +} + +if { ![support_displaced_stepping] } { + unsupported "inferior-died.exp" + return -1 +} + +set testfile "inferior-died" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.c] } { + return -1 +} + +gdb_test_no_output "set detach-on-fork off" +gdb_test_no_output "set target-async on" +gdb_test_no_output "set non-stop on" + +if ![runto_main] { + return +} + +set line [gdb_get_line_number "Break here"] +gdb_breakpoint $srcfile:$line + +gdb_continue_to_breakpoint "breakpoint" + +gdb_test "inferior 2" "Switching to inferior 2.*" +gdb_test "continue" "exited normally.*" diff --git a/gdb/thread.c b/gdb/thread.c index 9a29383..22d8b23 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -1072,6 +1072,7 @@ struct current_thread_cleanup int selected_frame_level; int was_stopped; int inf_id; + int was_removable; }; static void @@ -1112,10 +1113,14 @@ restore_current_thread_cleanup_dtor (void *arg) { struct current_thread_cleanup *old = arg; struct thread_info *tp; + struct inferior *inf; tp = find_thread_ptid (old->inferior_ptid); if (tp) tp->refcount--; + inf = find_inferior_id (old->inf_id); + if (inf != NULL) + inf->removable = old->was_removable; xfree (old); } @@ -1129,6 +1134,7 @@ make_cleanup_restore_current_thread (void) old = xmalloc (sizeof (struct current_thread_cleanup)); old->inferior_ptid = inferior_ptid; old->inf_id = current_inferior ()->num; + old->was_removable = current_inferior ()->removable; if (!ptid_equal (inferior_ptid, null_ptid)) { @@ -1156,6 +1162,8 @@ make_cleanup_restore_current_thread (void) tp->refcount++; } + current_inferior ()->removable = 0; + return make_cleanup_dtor (do_restore_current_thread_cleanup, old, restore_current_thread_cleanup_dtor); } |