This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] Merge handling of TARGET_WAITKIND_EXITED and TARGET_WAITKIND_SIGNALLED into a single switch case.
- From: Pedro Alves <palves at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Fri, 26 Oct 2012 19:50:24 +0100
- Subject: [PATCH] Merge handling of TARGET_WAITKIND_EXITED and TARGET_WAITKIND_SIGNALLED into a single switch case.
When I was experimenting with alternative fixes to PR gdb/14766, I
noticed I was always needing to do the same changes twice, once for
each of the TARGET_WAITKIND_EXITED and TARGET_WAITKIND_SIGNALLED
paths. Comparing the branches, one realizes that the meat of the
actual inferior handling is the same; they differ on what they print.
This unifies the code paths to reduce and avoid further duplification.
The fix for the bug ended up not touching this, but still I think it's
worth it to do this. I will need to touch this code on another
series...
Tested on Fedora 17, and applied.
gdb/
2012-10-26 Pedro Alves <palves@redhat.com>
* infrun.c (handle_inferior_event): Merge handling of
TARGET_WAITKIND_EXITED and TARGET_WAITKIND_SIGNALLED into a single
switch case.
---
gdb/infrun.c | 51 ++++++++++++++++++++++++---------------------------
1 file changed, 24 insertions(+), 27 deletions(-)
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 5479486..d79c6bd 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -3370,23 +3370,38 @@ handle_inferior_event (struct execution_control_state *ecs)
return;
case TARGET_WAITKIND_EXITED:
+ case TARGET_WAITKIND_SIGNALLED:
if (debug_infrun)
- fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_EXITED\n");
+ {
+ if (ecs->ws.kind == TARGET_WAITKIND_EXITED)
+ fprintf_unfiltered (gdb_stdlog,
+ "infrun: TARGET_WAITKIND_EXITED\n");
+ else
+ fprintf_unfiltered (gdb_stdlog,
+ "infrun: TARGET_WAITKIND_SIGNALLED\n");
+ }
+
inferior_ptid = ecs->ptid;
set_current_inferior (find_inferior_pid (ptid_get_pid (ecs->ptid)));
set_current_program_space (current_inferior ()->pspace);
handle_vfork_child_exec_or_exit (0);
target_terminal_ours (); /* Must do this before mourn anyway. */
- print_exited_reason (ecs->ws.value.integer);
- /* Record the exit code in the convenience variable $_exitcode, so
- that the user can inspect this again later. */
- set_internalvar_integer (lookup_internalvar ("_exitcode"),
- (LONGEST) ecs->ws.value.integer);
+ if (ecs->ws.kind == TARGET_WAITKIND_EXITED)
+ {
+ /* Record the exit code in the convenience variable $_exitcode, so
+ that the user can inspect this again later. */
+ set_internalvar_integer (lookup_internalvar ("_exitcode"),
+ (LONGEST) ecs->ws.value.integer);
+
+ /* Also record this in the inferior itself. */
+ current_inferior ()->has_exit_code = 1;
+ current_inferior ()->exit_code = (LONGEST) ecs->ws.value.integer;
- /* Also record this in the inferior itself. */
- current_inferior ()->has_exit_code = 1;
- current_inferior ()->exit_code = (LONGEST) ecs->ws.value.integer;
+ print_exited_reason (ecs->ws.value.integer);
+ }
+ else
+ print_signal_exited_reason (ecs->ws.value.sig);
gdb_flush (gdb_stdout);
target_mourn_inferior ();
@@ -3396,24 +3411,6 @@ handle_inferior_event (struct execution_control_state *ecs)
stop_stepping (ecs);
return;
- case TARGET_WAITKIND_SIGNALLED:
- if (debug_infrun)
- fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SIGNALLED\n");
- inferior_ptid = ecs->ptid;
- set_current_inferior (find_inferior_pid (ptid_get_pid (ecs->ptid)));
- set_current_program_space (current_inferior ()->pspace);
- handle_vfork_child_exec_or_exit (0);
- stop_print_frame = 0;
- target_terminal_ours (); /* Must do this before mourn anyway. */
-
- target_mourn_inferior ();
-
- print_signal_exited_reason (ecs->ws.value.sig);
- singlestep_breakpoints_inserted_p = 0;
- cancel_single_step_breakpoints ();
- stop_stepping (ecs);
- return;
-
/* The following are the only cases in which we keep going;
the above cases end in a continue or goto. */
case TARGET_WAITKIND_FORKED: