From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6211 invoked by alias); 1 Apr 2008 18:52:27 -0000 Received: (qmail 6201 invoked by uid 22791); 1 Apr 2008 18:52:26 -0000 X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 01 Apr 2008 18:51:45 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id m31Ipb9T002115; Tue, 1 Apr 2008 14:51:37 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [10.11.255.20]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m31IpbdC021854; Tue, 1 Apr 2008 14:51:37 -0400 Received: from opsy.redhat.com (vpn-248-47.boston.redhat.com [10.13.248.47]) by pobox.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m31IpaeE018054; Tue, 1 Apr 2008 14:51:36 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id AEB00508270; Tue, 1 Apr 2008 11:53:53 -0600 (MDT) To: Nick Roberts Cc: gdb-patches@sourceware.org Subject: Re: [RFC] Using bt command in async mode References: <18417.38670.195071.81191@kahikatea.snap.net.nz> From: Tom Tromey Reply-To: tromey@redhat.com X-Attribution: Tom Date: Tue, 01 Apr 2008 19:55:00 -0000 In-Reply-To: <18417.38670.195071.81191@kahikatea.snap.net.nz> (Nick Roberts's message of "Tue\, 1 Apr 2008 13\:59\:42 +1200") Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 2008-04/txt/msg00026.txt.bz2 >>>>> "Nick" == Nick Roberts writes: Nick> This patch allows the bt to be executed in async mode while the Nick> inferior is executing. Nick> ! && strcmp (c->name, "interrupt") != 0 Nick> ! && strcmp (c->name, "bt") != 0) I've seen a couple patches recently that touch this conditional. What do you think of this? It moves the flag into the command object instead of hard-coding it into a big 'if'. I'm running the test suite now. Tom ChangeLog: 2008-04-01 Tom Tromey * cli/cli-decode.h (CMD_ASYNC_OK): New define. (set_cmd_async_ok, get_cmd_async_ok): Declare. * cli/cli-decode.c (set_cmd_async_ok): New function. (get_cmd_async_ok): New function. * cli/cli-cmds.c (init_cli_cmds): Mark "pwd", "help", "info", and "show" as async-ok. * top.c (execute_command): Use get_cmd_async_ok. * infcmd.c: Include cli/cli-decode.h. (_initialize_infcmd): Mark "interrupt" as async-ok. * Makefile.in (infcmd.o): Depend on cli_decode_h. Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.996 diff -u -r1.996 Makefile.in --- Makefile.in 26 Mar 2008 14:53:28 -0000 1.996 +++ Makefile.in 1 Apr 2008 18:38:21 -0000 @@ -2291,7 +2291,7 @@ $(objfiles_h) $(completer_h) $(ui_out_h) $(event_top_h) \ $(parser_defs_h) $(regcache_h) $(reggroups_h) $(block_h) \ $(solib_h) $(gdb_assert_h) $(observer_h) $(target_descriptions_h) \ - $(user_regs_h) $(exceptions_h) + $(user_regs_h) $(exceptions_h) $(cli_decode_h) inf-loop.o: inf-loop.c $(defs_h) $(inferior_h) $(target_h) $(event_loop_h) \ $(event_top_h) $(inf_loop_h) $(remote_h) $(exceptions_h) \ $(language_h) Index: infcmd.c =================================================================== RCS file: /cvs/src/src/gdb/infcmd.c,v retrieving revision 1.174 diff -u -r1.174 infcmd.c --- infcmd.c 17 Mar 2008 17:30:29 -0000 1.174 +++ infcmd.c 1 Apr 2008 18:38:21 -0000 @@ -49,6 +49,7 @@ #include "target-descriptions.h" #include "user-regs.h" #include "exceptions.h" +#include "cli/cli-decode.h" /* Functions exported for general use, in inferior.h: */ @@ -2326,8 +2327,9 @@ \"run\" command.")); set_cmd_completer (c, filename_completer); - add_com ("interrupt", class_run, interrupt_target_command, - _("Interrupt the execution of the debugged program.")); + c = add_com ("interrupt", class_run, interrupt_target_command, + _("Interrupt the execution of the debugged program.")); + set_cmd_async_ok (c); add_info ("registers", nofp_registers_info, _("\ List of integer registers and their contents, for selected stack frame.\n\ Index: top.c =================================================================== RCS file: /cvs/src/src/gdb/top.c,v retrieving revision 1.137 diff -u -r1.137 top.c --- top.c 23 Mar 2008 17:29:34 -0000 1.137 +++ top.c 1 Apr 2008 18:38:21 -0000 @@ -458,13 +458,8 @@ /* If the target is running, we allow only a limited set of commands. */ - if (target_can_async_p () && target_executing) - if (strcmp (c->name, "help") != 0 - && strcmp (c->name, "pwd") != 0 - && strcmp (c->name, "show") != 0 - && strcmp (c->name, "info") != 0 - && strcmp (c->name, "interrupt") != 0) - error (_("Cannot execute this command while the target is running.")); + if (target_can_async_p () && target_executing && !get_cmd_async_ok (c)) + error (_("Cannot execute this command while the target is running.")); /* Pass null arg rather than an empty one. */ arg = *p ? p : 0; Index: cli/cli-cmds.c =================================================================== RCS file: /cvs/src/src/gdb/cli/cli-cmds.c,v retrieving revision 1.73 diff -u -r1.73 cli-cmds.c --- cli/cli-cmds.c 1 Jan 2008 22:53:14 -0000 1.73 +++ cli/cli-cmds.c 1 Apr 2008 18:38:21 -0000 @@ -1202,8 +1202,9 @@ /* Define general commands. */ - add_com ("pwd", class_files, pwd_command, _("\ + c = add_com ("pwd", class_files, pwd_command, _("\ Print working directory. This is used for your program as well.")); + set_cmd_async_ok (c); c = add_cmd ("cd", class_files, cd_command, _("\ Set working directory to DIR for debugger and program being debugged.\n\ The change does not take effect for the program being debugged\n\ @@ -1243,6 +1244,7 @@ c = add_com ("help", class_support, help_command, _("Print list of commands.")); set_cmd_completer (c, command_completer); + set_cmd_async_ok (c); add_com_alias ("q", "quit", class_support, 1); add_com_alias ("h", "help", class_support, 1); @@ -1268,17 +1270,19 @@ show_history_expansion_p, &sethistlist, &showhistlist); - add_prefix_cmd ("info", class_info, info_command, _("\ + c = add_prefix_cmd ("info", class_info, info_command, _("\ Generic command for showing things about the program being debugged."), - &infolist, "info ", 0, &cmdlist); + &infolist, "info ", 0, &cmdlist); + set_cmd_async_ok (c); add_com_alias ("i", "info", class_info, 1); add_com ("complete", class_obscure, complete_command, _("List the completions for the rest of the line as a command.")); - add_prefix_cmd ("show", class_info, show_command, - _("Generic command for showing things about the debugger."), - &showlist, "show ", 0, &cmdlist); + c = add_prefix_cmd ("show", class_info, show_command, _("\ +Generic command for showing things about the debugger."), + &showlist, "show ", 0, &cmdlist); + set_cmd_async_ok (c); /* Another way to get at the same thing. */ add_info ("set", show_command, _("Show all GDB settings.")); Index: cli/cli-decode.c =================================================================== RCS file: /cvs/src/src/gdb/cli/cli-decode.c,v retrieving revision 1.63 diff -u -r1.63 cli-decode.c --- cli/cli-decode.c 1 Jan 2008 22:53:14 -0000 1.63 +++ cli/cli-decode.c 1 Apr 2008 18:38:22 -0000 @@ -105,6 +105,18 @@ return cmd->context; } +void +set_cmd_async_ok (struct cmd_list_element *cmd) +{ + cmd->flags |= CMD_ASYNC_OK; +} + +int +get_cmd_async_ok (struct cmd_list_element *cmd) +{ + return cmd->flags & CMD_ASYNC_OK; +} + enum cmd_types cmd_type (struct cmd_list_element *cmd) { Index: cli/cli-decode.h =================================================================== RCS file: /cvs/src/src/gdb/cli/cli-decode.h,v retrieving revision 1.27 diff -u -r1.27 cli-decode.h --- cli/cli-decode.h 1 Jan 2008 22:53:14 -0000 1.27 +++ cli/cli-decode.h 1 Apr 2008 18:38:22 -0000 @@ -48,6 +48,9 @@ #define DEPRECATED_WARN_USER 0x2 #define MALLOCED_REPLACEMENT 0x4 +/* This flag is set if the command is allowed during async execution. */ +#define CMD_ASYNC_OK 0x8 + struct cmd_list_element { /* Points to next command in this list. */ @@ -243,6 +246,13 @@ extern void set_cmd_context (struct cmd_list_element *cmd, void *context); extern void *get_cmd_context (struct cmd_list_element *cmd); +/* Mark command as async-ready; there is no way to disable this once + set. */ +extern void set_cmd_async_ok (struct cmd_list_element *); + +/* Return true if command is async-ok. */ +extern int get_cmd_async_ok (struct cmd_list_element *); + extern struct cmd_list_element *lookup_cmd (char **, struct cmd_list_element *, char *, int, int);