+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.
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);