summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Prus <vladimir@codesourcery.com>2008-11-17 16:39:50 +0000
committerVladimir Prus <vladimir@codesourcery.com>2008-11-17 16:39:50 +0000
commit0c5574a0fc1b1b66e39bad41eb636efdc674eb05 (patch)
treeaaae5a1189feab4d9dcd932e92a235f87dd347a6
parent3b2206da375fca94003d4db0f72e1822a4e1f28e (diff)
downloadgdb-0c5574a0fc1b1b66e39bad41eb636efdc674eb05.tar.gz
Implement continue/interrupt of thread groups.
* mi/mi-main.c (proceed_thread_callback): New. (mi_cmd_exec_continue): If --thread-group is specified, resume all threads in that group. (interrupt_thread_callback): New. (mi_cmd_exec_interrupt): If --thread-group is specified, interrupt all threads in that group.
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/mi/mi-main.c66
2 files changed, 74 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 64e8eeeda50..03b066089e1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,16 @@
2008-11-17 Vladimir Prus <vladimir@codesourcery.com>
+ Implement continue/interrupt of thread groups.
+
+ * mi/mi-main.c (proceed_thread_callback): New.
+ (mi_cmd_exec_continue): If --thread-group is specified, resume all
+ threads in that group.
+ (interrupt_thread_callback): New.
+ (mi_cmd_exec_interrupt): If --thread-group is specified, interrupt
+ all threads in that group.
+
+2008-11-17 Vladimir Prus <vladimir@codesourcery.com>
+
Implement '-target-detach pid'.
* infcmd.c (detach_command): Make nonstatic.
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index ad4ed0c2680..6e5511fee99 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -162,6 +162,23 @@ mi_cmd_exec_return (char *command, char **argv, int argc)
print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS);
}
+static int
+proceed_thread_callback (struct thread_info *thread, void *arg)
+{
+ int pid = *(int *)arg;
+
+ if (!is_stopped (thread->ptid))
+ return 0;
+
+ if (PIDGET (thread->ptid) != pid)
+ return 0;
+
+ switch_to_thread (thread->ptid);
+ clear_proceed_status ();
+ proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
+ return 0;
+}
+
void
mi_cmd_exec_continue (char *command, char **argv, int argc)
{
@@ -169,8 +186,37 @@ mi_cmd_exec_continue (char *command, char **argv, int argc)
continue_1 (0);
else if (argc == 1 && strcmp (argv[0], "--all") == 0)
continue_1 (1);
+ else if (argc == 2 && strcmp (argv[0], "--thread-group") == 0)
+ {
+ struct cleanup *old_chain;
+ int pid;
+ if (argv[1] == NULL || argv[1] == '\0')
+ error ("Thread group id not specified");
+ pid = atoi (argv[1] + 1);
+ if (!in_inferior_list (pid))
+ error ("Invalid thread group id '%s'", argv[1]);
+
+ old_chain = make_cleanup_restore_current_thread ();
+ iterate_over_threads (proceed_thread_callback, &pid);
+ do_cleanups (old_chain);
+ }
else
- error ("Usage: -exec-continue [--all]");
+ error ("Usage: -exec-continue [--all|--thread-group id]");
+}
+
+static int
+interrupt_thread_callback (struct thread_info *thread, void *arg)
+{
+ int pid = *(int *)arg;
+
+ if (!is_running (thread->ptid))
+ return 0;
+
+ if (PIDGET (thread->ptid) != pid)
+ return 0;
+
+ target_stop (thread->ptid);
+ return 0;
}
/* Interrupt the execution of the target. Note how we must play around
@@ -192,11 +238,25 @@ mi_cmd_exec_interrupt (char *command, char **argv, int argc)
{
if (!any_running ())
error ("Inferior not running.");
-
+
interrupt_target_1 (1);
}
+ else if (argc == 2 && strcmp (argv[0], "--thread-group") == 0)
+ {
+ struct cleanup *old_chain;
+ int pid;
+ if (argv[1] == NULL || argv[1] == '\0')
+ error ("Thread group id not specified");
+ pid = atoi (argv[1] + 1);
+ if (!in_inferior_list (pid))
+ error ("Invalid thread group id '%s'", argv[1]);
+
+ old_chain = make_cleanup_restore_current_thread ();
+ iterate_over_threads (interrupt_thread_callback, &pid);
+ do_cleanups (old_chain);
+ }
else
- error ("Usage: -exec-interrupt [--all]");
+ error ("Usage: -exec-interrupt [--all|--thread-group id]");
}
static int