This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 3/7] attach to command_option-changed observer.


Hi,
This patch is to attach function 'mi_command_option_changed' to
observer 'command_option_changed', so that a MI notification
"=option-changed" is sent to MI frontend.  If the command option
change is requested from MI, the notification is suppressed.

gdb:

2012-07-24  Yao Qi  <yao@codesourcery.com>

	* NEWS: Mention new MI notification.
	* mi/mi-interp.c: Declare mi_command_option_changed.
	(mi_interpreter_init): Attach mi_command_option_changed to
	observer command_option_changed.
	(mi_command_option_changed): New.
	* mi/mi-main.c (mi_cmd_execute): Check command 'gdb-set' and set
	mi_suppress_notification.
	* mi/mi-main.h: New enum 'mi_suppress_option_changed'.

gdb/doc:

2012-07-24  Yao Qi  <yao@codesourcery.com>

	* gdb.texinfo (GDB/MI Async Records): Doc for '=option-changed'.
---
 gdb/NEWS            |    5 +++++
 gdb/doc/gdb.texinfo |    3 +++
 gdb/mi/mi-interp.c  |   30 +++++++++++++++++++++++++++++-
 gdb/mi/mi-main.c    |    7 +++++++
 gdb/mi/mi-main.h    |    6 +++++-
 5 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index 3333810..0f73e60 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,6 +3,11 @@
 
 *** Changes since GDB 7.5
 
+* MI changes
+
+  ** Command option changes are now notified using new async record
+     "=option-changed".
+
 *** Changes in GDB 7.5
 
 * GDB now supports x32 ABI.  Visit <http://sites.google.com/site/x32abi/>
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 68ea817..aa95a91 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -27638,6 +27638,9 @@ breakpoint commands; @xref{GDB/MI Breakpoint Commands}.
 Note that if a breakpoint is emitted in the result record of a
 command, then it will not also be emitted in an async record.
 
+@item =option-changed,option=@var{option},value=@var{value}
+Reports that an option of the command @code{set @var{option}} is
+changed to @var{value}.
 @end table
 
 @node GDB/MI Frame Information
diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index 7a2c088..b91f362 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -71,6 +71,7 @@ static void mi_about_to_proceed (void);
 static void mi_breakpoint_created (struct breakpoint *b);
 static void mi_breakpoint_deleted (struct breakpoint *b);
 static void mi_breakpoint_modified (struct breakpoint *b);
+static void mi_command_option_changed (const char *option, const char *value);
 
 static int report_initial_inferior (struct inferior *inf, void *closure);
 
@@ -128,6 +129,7 @@ mi_interpreter_init (struct interp *interp, int top_level)
       observer_attach_breakpoint_created (mi_breakpoint_created);
       observer_attach_breakpoint_deleted (mi_breakpoint_deleted);
       observer_attach_breakpoint_modified (mi_breakpoint_modified);
+      observer_attach_command_option_changed (mi_command_option_changed);
 
       /* The initial inferior is created before this function is
 	 called, so we need to report it explicitly.  Use iteration in
@@ -504,7 +506,7 @@ mi_about_to_proceed (void)
 /* When the element is non-zero, no MI notifications will be emitted in
    response to the corresponding observers.  */
 
-int mi_suppress_notification[] = { 0 };
+int mi_suppress_notification[] = { 0, 0 };
 
 /* Emit notification about a created breakpoint.  */
 
@@ -730,6 +732,32 @@ mi_solib_unloaded (struct so_list *solib)
   gdb_flush (mi->event_channel);
 }
 
+/* Emit notification about the command option change.  */
+
+static void
+mi_command_option_changed (const char *option, const char *value)
+{
+  struct mi_interp *mi = top_level_interpreter_data ();
+  struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
+
+  if (mi_suppress_notification[mi_suppress_option_changed])
+    return;
+
+  target_terminal_ours ();
+
+  fprintf_unfiltered (mi->event_channel,
+		      "option-changed");
+
+  ui_out_redirect (mi_uiout, mi->event_channel);
+
+  ui_out_field_string (mi_uiout, "option", option);
+  ui_out_field_string (mi_uiout, "value", value);
+
+  ui_out_redirect (mi_uiout, NULL);
+
+  gdb_flush (mi->event_channel);
+}
+
 static int
 report_initial_inferior (struct inferior *inf, void *closure)
 {
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 7ff8ab0..3962c9c 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -2104,6 +2104,13 @@ mi_cmd_execute (struct mi_parse *parse)
       make_cleanup_restore_integer (p);
       *p = 1;
     }
+  else if (strncmp (parse->command, "gdb-set", sizeof ("gdb-set") - 1) == 0)
+    {
+      int *p = &mi_suppress_notification[mi_suppress_option_changed];
+
+      make_cleanup_restore_integer (p);
+      *p = 1;
+    }
 
   if (parse->cmd->argv_func != NULL)
     {
diff --git a/gdb/mi/mi-main.h b/gdb/mi/mi-main.h
index 9e185d7..020de80 100644
--- a/gdb/mi/mi-main.h
+++ b/gdb/mi/mi-main.h
@@ -33,7 +33,11 @@ extern char *current_token;
 extern int running_result_record_printed;
 extern int mi_proceeded;
 
-enum mi_suppress_notification { mi_suppress_breakpoint };
+enum mi_suppress_notification
+  {
+    mi_suppress_breakpoint,
+    mi_suppress_option_changed,
+  };
 extern int mi_suppress_notification[];
 
 #endif
-- 
1.7.7.6


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]