This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFC] Using bt command in async mode
- From: Tom Tromey <tromey at redhat dot com>
- To: Nick Roberts <nickrob at snap dot net dot nz>
- Cc: gdb-patches at sourceware dot org
- Date: Tue, 01 Apr 2008 11:53:52 -0600
- Subject: Re: [RFC] Using bt command in async mode
- References: <18417.38670.195071.81191@kahikatea.snap.net.nz>
- Reply-to: tromey at redhat dot com
>>>>> "Nick" == Nick Roberts <nickrob@snap.net.nz> 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 <tromey@redhat.com>
* 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);