From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29195 invoked by alias); 21 Sep 2012 01:47:53 -0000 Received: (qmail 29186 invoked by uid 22791); 21 Sep 2012 01:47:50 -0000 X-SWARE-Spam-Status: No, hits=-4.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 21 Sep 2012 01:47:36 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1TEsL8-0006na-4Y from Yao_Qi@mentor.com ; Thu, 20 Sep 2012 18:47:34 -0700 Received: from SVR-ORW-FEM-03.mgc.mentorg.com ([147.34.97.39]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 20 Sep 2012 18:47:34 -0700 Received: from qiyao.dyndns.org (147.34.91.1) by svr-orw-fem-03.mgc.mentorg.com (147.34.97.39) with Microsoft SMTP Server id 14.1.289.1; Thu, 20 Sep 2012 18:47:32 -0700 Message-ID: <505BC704.5030505@codesourcery.com> Date: Fri, 21 Sep 2012 01:47:00 -0000 From: Yao Qi User-Agent: Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20120717 Thunderbird/14.0 MIME-Version: 1.0 To: Pedro Alves , CC: Eli Zaretskii Subject: [committed]: [PATCH 2/2] MI notification on record started and stopped References: <1347434118-10931-1-git-send-email-yao@codesourcery.com> <1347434118-10931-3-git-send-email-yao@codesourcery.com> <838vcfw2my.fsf@gnu.org> <50519FC6.3090704@codesourcery.com> <83r4q5vne6.fsf@gnu.org> <50529C21.5020909@codesourcery.com> <83boh9ue6b.fsf@gnu.org> <505318AD.50603@codesourcery.com> <50531E46.4090708@redhat.com> <50532D6D.5060400@codesourcery.com> <50533B81.2010009@redhat.com> In-Reply-To: <50533B81.2010009@redhat.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-09/txt/msg00421.txt.bz2 On 09/14/2012 10:13 PM, Pedro Alves wrote: > On 09/14/2012 02:13 PM, Yao Qi wrote: >> On 09/14/2012 08:08 PM, Pedro Alves wrote: >>> On 09/14/2012 12:44 PM, Yao Qi wrote: >>>> On 09/14/2012 05:49 PM, Eli Zaretskii wrote: >>>>>> The notification is like '=record-started,thread-group="i1"'. >>>>> ?? If this is a thread-group, why does i1 identify a_process_? Don't >>>>> you mean "thread group"? >>>> >>>> As matter of fact, this is an inferior, but in MI notification, we call "inferior" as "thread group", IIUC. So i1 identify an inferior. Your suggestion "the number assigned by @value{GDBN} to the inferior" is good to me. >>> >>> In these cases, I'd just go and copy what is written in other similar >>> cases already in the manual. Should make the end overall result a bit more >>> consistent. For example, borrowing from the "-add-inferior" command's text, >>> you'd get something like: >>> >>> "The notification has a single field, @samp{thread-group}, whose value is the >>> identifier of the thread group corresponding to the affected inferior." >>> >> >> How about this? >> >> The process record was either started or stopped in thread group >> @var{id}. The @var{id} is the identifier of the thread group >> corresponding to the affected inferior. > > Nitpicking at this point, as I think that already conveys the necessary > info. But, I think "Execution log recording" would sound more natural > than "The process record". The mention of @var{id} twice looks > redundant, yet disconnected. So I'd suggest: > > Execution log recording was either started or stopped on an > inferior. The @var{id} is the identifier of the thread group > corresponding to the affected inferior. > OK. This is what I committed. > Thanks, > -- Yao gdb/doc: 2012-09-21 Yao Qi Pedro Alves * gdb.texinfo (GDB/MI Async Records): Document notification 'record-started' and 'record-stopped'. * observer.texi (GDB Observers): New observer 'record-changed'. gdb: 2012-09-21 Yao Qi * 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: 2012-09-21 Yao Qi * 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 365b2d4..8351467 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -53,6 +53,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 1c8c1c2..5fcbada 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -27658,6 +27658,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}" +Execution log recording was either started or stopped on an +inferior. The @var{id} is the @value{GDBN} identifier of the thread +group corresponding to the affected inferior. + @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 09aa91f..a27e983 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 @@ -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 . + +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