aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/top.c46
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.
diff --git a/gdb/top.c b/gdb/top.c
index 76e8cb8..d0ba466 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -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);