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.
This commit is contained in:
Tom Tromey 2012-02-16 14:35:00 +00:00
parent bf4c19f73e
commit 9addecb9fb
5 changed files with 114 additions and 0 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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);
}

View File

@ -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.*"

View File

@ -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);
}