This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[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