Add non_stop global.
authorPedro Alves <palves@redhat.com>
Wed, 9 Jul 2008 22:27:13 +0000 (22:27 +0000)
committerPedro Alves <palves@redhat.com>
Wed, 9 Jul 2008 22:27:13 +0000 (22:27 +0000)
* inferior.h (non_stop): Declare.
* infrun.c (non_stop, non_stop_1): New.
(set_non_stop, show_non_stop): New.
(_initialize_infrun): Add "set/show non-stop" command.

gdb/ChangeLog
gdb/inferior.h
gdb/infrun.c

index 859a9a683d185a30ab97d9bf420438a0c3003c33..1b368739fd57d6e2a69fba368e2688e868235078 100644 (file)
@@ -1,3 +1,12 @@
+2008-07-09  Pedro Alves  <pedro@codesourcery.com>
+
+       Add non_stop global.
+
+       * inferior.h (non_stop): Declare.
+       * infrun.c (non_stop, non_stop_1): New.
+       (set_non_stop, show_non_stop): New.
+       (_initialize_infrun): Add "set/show non-stop" command.
+
 2008-07-09  Pedro Alves  <pedro@codesourcery.com>
 
        Adjust fork/vfork/exec to pass ptids around.
index 3c69d4ed71fec7176f3b48039015beeed04d8f10..9cbf4b4f188d44a4bf7fc78b6f09a330d5d80576 100644 (file)
@@ -137,6 +137,13 @@ extern void proceed (CORE_ADDR, enum target_signal, int);
    over such function.  */
 extern int step_stop_if_no_debug;
 
+/* If set, the inferior should be controlled in non-stop mode.  In
+   this mode, each thread is controlled independently.  Execution
+   commands apply only to the the selected thread by default, and stop
+   events stop only the thread that had the event -- the other threads
+   are kept running freely.  */
+extern int non_stop;
+
 extern void generic_mourn_inferior (void);
 
 extern void terminal_save_ours (void);
index 0a87371704bb4dced9aa9d747dbeb63e53704c04..d9eca9fe1c75264e76a9294b32b7edc752ec6d94 100644 (file)
@@ -4465,6 +4465,32 @@ save_inferior_ptid (void)
 }
 \f
 
+int non_stop = 0;
+static int non_stop_1 = 0;
+
+static void
+set_non_stop (char *args, int from_tty,
+             struct cmd_list_element *c)
+{
+  if (target_has_execution)
+    {
+      non_stop_1 = non_stop;
+      error (_("Cannot change this setting while the inferior is running."));
+    }
+
+  non_stop = non_stop_1;
+}
+
+static void
+show_non_stop (struct ui_file *file, int from_tty,
+              struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file,
+                   _("Controlling the inferior in non-stop mode is %s.\n"),
+                   value);
+}
+
+
 void
 _initialize_infrun (void)
 {
@@ -4538,6 +4564,26 @@ When non-zero, displaced stepping specific debugging is enabled."),
                            show_debug_displaced,
                            &setdebuglist, &showdebuglist);
 
+  add_setshow_boolean_cmd ("non-stop", no_class,
+                          &non_stop_1, _("\
+Set whether gdb controls the inferior in non-stop mode."), _("\
+Show whether gdb controls the inferior in non-stop mode."), _("\
+When debugging a multi-threaded program and this setting is\n\
+off (the default, also called all-stop mode), when one thread stops\n\
+(for a breakpoint, watchpoint, exception, or similar events), GDB stops\n\
+all other threads in the program while you interact with the thread of\n\
+interest.  When you continue or step a thread, you can allow the other\n\
+threads to run, or have them remain stopped, but while you inspect any\n\
+thread's state, all threads stop.\n\
+\n\
+In non-stop mode, when one thread stops, other threads can continue\n\
+to run freely.  You'll be able to step each thread independently,\n\
+leave it stopped or free to run as needed."),
+                          set_non_stop,
+                          show_non_stop,
+                          &setlist,
+                          &showlist);
+
   numsigs = (int) TARGET_SIGNAL_LAST;
   signal_stop = (unsigned char *) xmalloc (sizeof (signal_stop[0]) * numsigs);
   signal_print = (unsigned char *)