Re: [PATCH 2/2] MI notification on record started and stopped

Yao Qi
2012-09-13T08:57:38Z

On 09/13/2012 01:51 AM, Eli Zaretskii wrote:
>> +The process record is either started or stoped in process @var{id}.
>> >+The @var{id} field contains the @value{GDBN} identifier of process.
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> "contains the @value{GDBN} process ID."
>
> By the way: why is it useful to have the GDB PID part of this
> notification? Can you have more than one GDB process at a time that
> all communicate on the same wire?
>
> Or did you mean the inferior PID?

I meant the inferior PID. Originally I wrote "inferior ID" in doc, but
I found "inferior ID" is never used in gdb.texinfo. Looks
"@value{GDBN} identifier of the" is used. In this version, I change it
to:

"contains the @value{GDBN} identifier of the process",

because this pattern is used some times in doc. Is it OK?

Tom and Pedro's comments are address as well.

--
Yao

gdb/doc:

* gdb.texinfo (GDB/MI Async Records): Document notification
'record-started' and 'record-stopped'.
* observer.texi (GDB Observers): New observer 'record-changed'.
gdb:

* mi/mi-interp.c: Declare mi_record_changed.
(mi_interpreter_init): Call observer_attach_record_changed.
(mi_record_changed): New.
* record.c (record_open): Call observer_notify_record_changed.
(cmd_record_stop): Call observer_notify_record_changed.
* NEWS: Mention it.

gdb/testsuite:

* gdb.mi/mi-record-changed.exp: New.
* gdb.mi/mi-reverse.exp: Adjust expected output.
---
gdb/NEWS | 2 +
gdb/doc/gdb.texinfo | 6 ++++
gdb/doc/observer.texi | 7 ++++
gdb/mi/mi-interp.c | 15 +++++++++
gdb/record.c | 5 +++
gdb/testsuite/gdb.mi/mi-record-changed.exp | 44 ++++++++++++++++++++++++++++
gdb/testsuite/gdb.mi/mi-reverse.exp | 3 +-
7 files changed, 81 insertions(+), 1 deletions(-)
create mode 100644 gdb/testsuite/gdb.mi/mi-record-changed.exp

diff --git a/gdb/NEWS b/gdb/NEWS
index dad72af..d5220ed 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -47,6 +47,8 @@ py [command]
new async record "=traceframe-changed".
** The creation and deletion of trace state variables are now notified
using new async records "=tsv-created" and "=tsv-deleted".
+ ** The start and stop of process record are now notified using new
+ async record "=record-started" and "=record-stopped".

*** Changes in GDB 7.5

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 376eafa..b6755de 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -27661,6 +27661,12 @@ breakpoint commands; @xref{GDB/MI Breakpoint Commands}. The
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 =record-started,thread-group="@var{id}"
+@itemx =record-stopped,thread-group="@var{id}"
+The process record was either started or stopped in process @var{id}.
+The @var{id} field contains the @value{GDBN} identifier of the
+process .
+
@item =cmd-param-changed,param=@var{param},value=@var{value}
Reports that a parameter of the command @code{set @var{param}} is
changed to @var{value}. In the multi-word @code{set} command,
diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi
index 74aa8c8..b874f05 100644
--- a/gdb/doc/observer.texi
+++ b/gdb/doc/observer.texi
@@ -113,6 +113,13 @@ at the entry-point instruction. For @samp{attach} and @samp{core},
inferior, and before any information on the inferior has been printed.
@end deftypefun

+@deftypefun void record_changed (struct inferior *@var{inferior}, int @var{started})
+The status of process record for inferior @var{inferior} in
+@value{GDBN} has changed. The process record is started if
+@var{started} is true, and the process record is stopped if
+@var{started} is false.
+@end deftypefun
+
@deftypefun void solib_loaded (struct so_list *@var{solib})
The shared library specified by @var{solib} has been loaded. Note that
when @value{GDBN} calls this observer, the library's symbols probably
diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index 5c37bc7..d383958 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -60,6 +60,7 @@ static void mi_on_normal_stop (struct bpstats *bs, int print_frame);

static void mi_new_thread (struct thread_info *t);
static void mi_thread_exit (struct thread_info *t, int silent);
+static void mi_record_changed (struct inferior*, int);
static void mi_inferior_added (struct inferior *inf);
static void mi_inferior_appeared (struct inferior *inf);
static void mi_inferior_exit (struct inferior *inf);
@@ -124,6 +125,7 @@ mi_interpreter_init (struct interp *interp, int top_level)
observer_attach_inferior_appeared (mi_inferior_appeared);
observer_attach_inferior_exit (mi_inferior_exit);
observer_attach_inferior_removed (mi_inferior_removed);
+ observer_attach_record_changed (mi_record_changed);
observer_attach_normal_stop (mi_on_normal_stop);
observer_attach_target_resumed (mi_on_resume);
observer_attach_solib_loaded (mi_solib_loaded);
@@ -381,6 +383,19 @@ mi_thread_exit (struct thread_info *t, int silent)
gdb_flush (mi->event_channel);
}

+/* Emit notification on changing the state of record. */
+
+static void
+mi_record_changed (struct inferior *inferior, int started)
+{
+ struct mi_interp *mi = top_level_interpreter_data ();
+
+ fprintf_unfiltered (mi->event_channel, "record-%s,thread-group=\"i%d\"",
+ started ? "started" : "stopped", inferior->num);
+
+ gdb_flush (mi->event_channel);
+}
+
static void
mi_inferior_added (struct inferior *inf)
{
diff --git a/gdb/record.c b/gdb/record.c
index 5cbac00..c98ed32 100644
--- a/gdb/record.c
+++ b/gdb/record.c
@@ -33,6 +33,7 @@
#include "event-loop.h"
#include "inf-loop.h"
#include "gdb_bfd.h"
+#include "observer.h"

#include <signal.h>

@@ -1001,6 +1002,8 @@ record_open (char *name, int from_tty)
NULL);

record_init_record_breakpoints ();
+
+ observer_notify_record_changed (current_inferior (), 1);
}

/* "to_close" target method. Close the process record target. */
@@ -2260,6 +2263,8 @@ cmd_record_stop (char *args, int from_tty)
unpush_target (&record_ops);
printf_unfiltered (_("Process record is stopped and all execution "
"logs are deleted.\n"));
+
+ observer_notify_record_changed (current_inferior (), 0);
}
else
printf_unfiltered (_("Process record is not started.\n"));
diff --git a/gdb/testsuite/gdb.mi/mi-record-changed.exp b/gdb/testsuite/gdb.mi/mi-record-changed.exp
new file mode 100644
index 0000000..bb54248
--- /dev/null
+++ b/gdb/testsuite/gdb.mi/mi-record-changed.exp
@@ -0,0 +1,44 @@
+# Copyright 2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+if ![supports_process_record] {
+ return
+}
+
+standard_testfile basics.c
+if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
+ executable {debug nowarnings}] != "" } {
+ untested mi-record-changed.exp
+ return -1
+}
+
+load_lib mi-support.exp
+
+if [mi_gdb_start] {
+ return
+}
+mi_run_to_main
+
+mi_gdb_test "record" ".*=record-started,thread-group=\"i${decimal}\".*\\^done" \
+ "record"
+mi_gdb_test "record stop" \
+ ".*=record-stopped,thread-group=\"i${decimal}\".*\\^done" \
+ "record end"
+
+mi_gdb_test "target record" \
+ ".*=record-started,thread-group=\"i${decimal}\".*\\^done" \
+ "target record"
+
+return 0
diff --git a/gdb/testsuite/gdb.mi/mi-reverse.exp b/gdb/testsuite/gdb.mi/mi-reverse.exp
index f65493d..974a095 100644
--- a/gdb/testsuite/gdb.mi/mi-reverse.exp
+++ b/gdb/testsuite/gdb.mi/mi-reverse.exp
@@ -51,7 +51,8 @@ mi_run_to_main
if [supports_process_record] {
# Activate process record/replay
if [mi_gdb_test "-interpreter-exec console record" \
- {\^done} "Turn on process record"] {
+ "=record-started,id=\"1\"\r\n\\^done" \
+ "Turn on process record"] {
warning "Fail to activate process record/replay, tests in this group will not be performed.\n";
return -1
}
--
1.7.7.6