diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/top.c | 46 |
2 files changed, 44 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 55b0a63..6fe342a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2008-09-22 Pedro Alves <pedro@codesourcery.com> + * top.c (any_thread_of, kill_or_detach): New functions. + (quit_target): Iterate over all inferiors, killing or detaching + accordingly. + +2008-09-22 Pedro Alves <pedro@codesourcery.com> + Remove the attach_flag global, and make it per-inferior. * inferior.h (attach_flag): Delete. @@ -1204,28 +1204,58 @@ quit_confirm (void) return 1; } -/* Helper routine for quit_force that requires error handling. */ - struct qt_args { char *args; int from_tty; }; +/* Callback for iterate_over_threads. Finds any thread of inferior + given by ARG (really an int*). */ + static int -quit_target (void *arg) +any_thread_of (struct thread_info *thread, void *arg) { - struct qt_args *qt = (struct qt_args *)arg; + int pid = * (int *)arg; - if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution) + if (PIDGET (thread->ptid) == pid) + return 1; + + return 0; +} + +/* Callback for iterate_over_inferiors. Kills or detaches the given + inferior, depending on how we originally gained control of it. */ + +static int +kill_or_detach (struct inferior *inf, void *args) +{ + struct qt_args *qt = args; + struct thread_info *thread; + + thread = iterate_over_threads (any_thread_of, &inf->pid); + if (thread) { - struct inferior *inf = current_inferior (); + switch_to_thread (thread->ptid); if (inf->attach_flag) - target_detach (qt->args, qt->from_tty); + target_detach (qt->args, qt->from_tty); else - target_kill (); + target_kill (); } + return 0; +} + +/* Helper routine for quit_force that requires error handling. */ + +static int +quit_target (void *arg) +{ + struct qt_args *qt = (struct qt_args *)arg; + + /* Kill or detach all inferiors. */ + iterate_over_inferiors (kill_or_detach, qt); + /* Give all pushed targets a chance to do minimal cleanup, and pop them all out. */ pop_all_targets (1); |