From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31571 invoked by alias); 15 Aug 2008 17:30:40 -0000 Received: (qmail 31552 invoked by uid 22791); 15 Aug 2008 17:30:36 -0000 X-Spam-Check-By: sourceware.org Received: from imr2.ericy.com (HELO imr2.ericy.com) (198.24.6.3) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 15 Aug 2008 17:29:54 +0000 Received: from eusrcmw750.eamcs.ericsson.se (eusrcmw750.exu.ericsson.se [138.85.77.50]) by imr2.ericy.com (8.13.1/8.13.1) with ESMTP id m7FHTn3i015161; Fri, 15 Aug 2008 12:29:49 -0500 Received: from ecamlmw720.eamcs.ericsson.se ([142.133.1.72]) by eusrcmw750.eamcs.ericsson.se with Microsoft SMTPSVC(6.0.3790.1830); Fri, 15 Aug 2008 12:29:49 -0500 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: RE: [RFA] Unify async setting. Date: Fri, 15 Aug 2008 17:30:00 -0000 Message-ID: <6D19CA8D71C89C43A057926FE0D4ADAA042912F6@ecamlmw720.eamcs.ericsson.se> In-Reply-To: <200808152107.19270.vladimir@codesourcery.com> From: "Marc Khouzam" To: "Vladimir Prus" , 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: 2008-08/txt/msg00426.txt.bz2 Hi, it think it is great to have a single command to set async for native or targets. Will the command be 'set async' or 'set target-async', the patch seems to use target-async. Thanks > -----Original Message----- > From: gdb-patches-owner@sourceware.org > [mailto:gdb-patches-owner@sourceware.org]On Behalf Of Vladimir Prus > Sent: Friday, August 15, 2008 1:07 PM > To: gdb-patches@sources.redhat.com > Subject: [RFA] Unify async setting. >=20 >=20 >=20 > Presently, one need to use different commands to request=20 > async mode for linux > native and for async targets, which is hard on frontends.=20=20 > Furthermore, the > relevant variables merely *allow* async mode, and there's no=20 > way for frontend > to make sure that async mode is actually in effect. This=20 > patch makes two things: >=20 > - Converts target-specific variables into a single 'set=20 > async' command. > - Adds new MI -list-target-features command that allows to=20 > check if current > target is in async mode. >=20 > The bulk of the patch is actually written by Pedro, I've only=20 > added MI/testsuite/doc > bits. >=20 > OK? >=20 > - Volodya >=20 > * target.c (target_async_permitted, target_async_permitted_1) > (set_maintenance_target_async_permitted) > (show_maintenance_target_async_permitted): New. > (initialize_targets): Register 'set target-async'. > * target.h (target_async_permitted): Declare. > * linux-nat.c (linux_nat_async_enabled) > (linux_nat_async_permitted,=20 > set_maintenance_linux_async_permitted) > (show_maintenance_linux_async_permitted): Remove. > (sigchld_handler, linux_nat_is_async_p, linux_nat_can_async_p) > (get_pending_events, linux_nat_async): Use=20 > target_async_permitted. > (linux_nat_set_async_mode): Remove, moving the only used bits > into... > (linux_nat_setup_async): This. > (_initialize_linux_nat): Do not register 'maint set=20 > linux-async'. > Use linux_nat_setup_async. > * remote.c (remote_async_permitted, remote_async_permitted_set) > (set_maintenance_remote_async_permitted) > (show_maintenance_remote_async_permitted): Remove. > (remote_open_1, remote_terminal_inferior, remote_can_async_p) > (remote_is_async_p): Use target_async_permitted. > (_initialize_remote): Don't register 'main set remote-async'. > * mi/mi-cmds.c (mi_cmds): Register -list-target-features. > * mi/mi-cmds.h (mi_cmd_list_target_features): New. > * mi/mi-main.c (mi_cmd_list_target_features): New. >=20 > [testsuite/ChangeLog] > * gdb.mi/mi-async.exp: Use 'set target-async'. > * lib/mi-support.exp: Use 'set/show target-async'. >=20 > [doc/ChangeLog] > * gdb.texinfo (Background execution): Adjust example > (GDB/MI Miscellaneous Commands): Document -list-target-features. > --- > gdb/doc/gdb.texinfo | 33 +++++++++++-- > gdb/linux-nat.c | 101=20 > +++++++----------------------------- > gdb/mi/mi-cmds.c | 1 + > gdb/mi/mi-cmds.h | 1 + > gdb/mi/mi-main.c | 20 +++++++- > gdb/remote.c | 54 +++----------------- > gdb/target.c | 39 ++++++++++++++ > gdb/target.h | 4 ++ > gdb/testsuite/gdb.mi/mi-async.exp | 2 +- > gdb/testsuite/lib/mi-support.exp | 4 +- > 10 files changed, 124 insertions(+), 135 deletions(-) >=20 > diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo > index 1ef4c8a..3ba9a59 100644 > --- a/gdb/doc/gdb.texinfo > +++ b/gdb/doc/gdb.texinfo > @@ -4572,12 +4572,9 @@ independently and simultaneously. > To enter non-stop mode, use this sequence of commands before you run > or attach to your program: >=20=20 > -@c FIXME: can we fix this recipe to avoid the=20 > linux-async/remote-async details? > - > @smallexample > # Enable the async interface.=20=20 > -# For target remote, use remote-async instead of linux-async. > -maint set linux-async 1 > +set async 1 >=20=20 > # If using the CLI, pagination breaks non-stop. > set pagination off > @@ -22637,6 +22634,34 @@ option to the @code{-break-insert} command. >=20=20 > @end itemize >=20=20 > +@subheading The @code{-list-target-features} Command > +@findex -list-target-features > + > +Returns a list of particular features that are supported by the > +target. Those features affect the permitted MI commands, but=20 > +unlike the features reported by the @code{-list-features}=20 > command, the > +features depend on which target GDB is using at the moment. Whenever > +a target can change, due to commands such as @code{-target-select}, > +@code{-target-attach} or @code{-exec-run}, the list of=20 > target features > +may change, and the frontend should obtain it again. > +Example output: > + > +@smallexample > +(gdb) -list-features > +^done,result=3D["async"] > +@end smallexample > + > +The current list of features is: > + > +@itemize @minus > +@item > +@samp{async}---indicates that the target is capable of asynchronous > +command execution, which means that GDB will accept further commands > +even while the target is running. > + > +@end itemize > + > + > @subheading The @code{-interpreter-exec} Command > @findex -interpreter-exec >=20=20 > diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c > index b59a35c..b25104e 100644 > --- a/gdb/linux-nat.c > +++ b/gdb/linux-nat.c > @@ -276,9 +276,6 @@ static int=20 > linux_supports_tracevforkdone_flag =3D -1; >=20=20 > /* Async mode support */ >=20=20 > -/* True if async mode is currently on. */ > -static int linux_nat_async_enabled; > - > /* Zero if the async mode, although enabled, is masked, which means > linux_nat_wait should behave as if async mode was off. */ > static int linux_nat_async_mask_value =3D 1; > @@ -3205,7 +3202,7 @@ linux_nat_pid_to_str (ptid_t ptid) > static void > sigchld_handler (int signo) > { > - if (linux_nat_async_enabled > + if (target_async_permitted > && linux_nat_async_events_state !=3D sigchld_sync > && signo =3D=3D SIGCHLD) > /* It is *always* a bug to hit this. */ > @@ -3992,45 +3989,15 @@ linux_trad_target (CORE_ADDR=20 > (*register_u_offset)(struct gdbarch *, int, int)) > return t; > } >=20=20 > -/* Controls if async mode is permitted. */ > -static int linux_async_permitted =3D 0; > - > -/* The set command writes to this variable. If the inferior is > - executing, linux_nat_async_permitted is *not* updated. */ > -static int linux_async_permitted_1 =3D 0; > - > -static void > -set_maintenance_linux_async_permitted (char *args, int from_tty, > - struct cmd_list_element *c) > -{ > - if (target_has_execution) > - { > - linux_async_permitted_1 =3D linux_async_permitted; > - error (_("Cannot change this setting while the=20 > inferior is running.")); > - } > - > - linux_async_permitted =3D linux_async_permitted_1; > - linux_nat_set_async_mode (linux_async_permitted); > -} > - > -static void > -show_maintenance_linux_async_permitted (struct ui_file=20 > *file, int from_tty, > - struct cmd_list_element *c, const=20 > char *value) > -{ > - fprintf_filtered (file, _("\ > -Controlling the GNU/Linux inferior in asynchronous mode is %s.\n"), > - value); > -} > - > /* target_is_async_p implementation. */ >=20=20 > static int > linux_nat_is_async_p (void) > { > /* NOTE: palves 2008-03-21: We're only async when the user requests > - it explicitly with the "maintenance set linux-async" command. > + it explicitly with the "maintenance set target-async" command. > Someday, linux will always be async. */ > - if (!linux_async_permitted) > + if (!target_async_permitted) > return 0; >=20=20 > return 1; > @@ -4042,9 +4009,9 @@ static int > linux_nat_can_async_p (void) > { > /* NOTE: palves 2008-03-21: We're only async when the user requests > - it explicitly with the "maintenance set linux-async" command. > + it explicitly with the "maintenance set target-async" command. > Someday, linux will always be async. */ > - if (!linux_async_permitted) > + if (!target_async_permitted) > return 0; >=20=20 > /* See target.h/target_async_mask. */ > @@ -4125,7 +4092,7 @@ get_pending_events (void) > { > int status, options, pid; >=20=20 > - if (!linux_nat_async_enabled > + if (!target_async_permitted > || linux_nat_async_events_state !=3D sigchld_async) > internal_error (__FILE__, __LINE__, > "get_pending_events called with async masked"); > @@ -4329,7 +4296,7 @@ static void > linux_nat_async (void (*callback) (enum inferior_event_type=20 > event_type, > void *context), void *context) > { > - if (linux_nat_async_mask_value =3D=3D 0 || !linux_nat_async_enabled) > + if (linux_nat_async_mask_value =3D=3D 0 || !target_async_permitted) > internal_error (__FILE__, __LINE__, > "Calling target_async when async is masked"); >=20=20 > @@ -4353,35 +4320,6 @@ linux_nat_async (void (*callback)=20 > (enum inferior_event_type event_type, > return; > } >=20=20 > -/* Enable/Disable async mode. */ > - > -static void > -linux_nat_set_async_mode (int on) > -{ > - if (linux_nat_async_enabled !=3D on) > - { > - if (on) > - { > - gdb_assert (waitpid_queue =3D=3D NULL); > - if (pipe (linux_nat_event_pipe) =3D=3D -1) > - internal_error (__FILE__, __LINE__, > - "creating event pipe failed."); > - fcntl (linux_nat_event_pipe[0], F_SETFL, O_NONBLOCK); > - fcntl (linux_nat_event_pipe[1], F_SETFL, O_NONBLOCK); > - } > - else > - { > - drain_queued_events (-1); > - linux_nat_num_queued_events =3D 0; > - close (linux_nat_event_pipe[0]); > - close (linux_nat_event_pipe[1]); > - linux_nat_event_pipe[0] =3D linux_nat_event_pipe[1] =3D -1; > - > - } > - } > - linux_nat_async_enabled =3D on; > -} > - > static int > send_sigint_callback (struct lwp_info *lp, void *data) > { > @@ -4478,6 +4416,18 @@ linux_nat_get_siginfo (ptid_t ptid) > return &lp->siginfo; > } >=20=20 > +/* Enable/Disable async mode. */ > + > +static void > +linux_nat_setup_async (void) > +{ > + if (pipe (linux_nat_event_pipe) =3D=3D -1) > + internal_error (__FILE__, __LINE__, > + "creating event pipe failed."); > + fcntl (linux_nat_event_pipe[0], F_SETFL, O_NONBLOCK); > + fcntl (linux_nat_event_pipe[1], F_SETFL, O_NONBLOCK); > +} > + > void > _initialize_linux_nat (void) > { > @@ -4510,16 +4460,6 @@ Enables printf debugging output."), > show_debug_linux_nat_async, > &setdebuglist, &showdebuglist); >=20=20 > - add_setshow_boolean_cmd ("linux-async", class_maintenance, > - &linux_async_permitted_1, _("\ > -Set whether gdb controls the GNU/Linux inferior in=20 > asynchronous mode."), _("\ > -Show whether gdb controls the GNU/Linux inferior in=20 > asynchronous mode."), _("\ > -Tells gdb whether to control the GNU/Linux inferior in=20 > asynchronous mode."), > - set_maintenance_linux_async_permitted, > - show_maintenance_linux_async_permitted, > - &maintenance_set_cmdlist, > - &maintenance_show_cmdlist); > - > /* Get the default SIGCHLD action. Used while forking an inferior > (see linux_nat_create_inferior/linux_nat_async_events). */ > sigaction (SIGCHLD, NULL, &sigchld_default_action); > @@ -4551,8 +4491,7 @@ Tells gdb whether to control the=20 > GNU/Linux inferior in asynchronous mode."), > sigemptyset (&async_sigchld_action.sa_mask); > async_sigchld_action.sa_flags =3D SA_RESTART; >=20=20 > - /* Install the default mode. */ > - linux_nat_set_async_mode (linux_async_permitted); > + linux_nat_setup_async (); >=20=20 > add_setshow_boolean_cmd ("disable-randomization", class_support, > &disable_randomization, _("\ > diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c > index 3ae4c95..ca0f428 100644 > --- a/gdb/mi/mi-cmds.c > +++ b/gdb/mi/mi-cmds.c > @@ -89,6 +89,7 @@ struct mi_cmd mi_cmds[] =3D > { "inferior-tty-show", { NULL, 0 }, mi_cmd_inferior_tty_show}, > { "interpreter-exec", { NULL, 0 }, mi_cmd_interpreter_exec}, > { "list-features", { NULL, 0 }, mi_cmd_list_features}, > + { "list-target-features", { NULL, 0 },=20 > mi_cmd_list_target_features}, > { "overlay-auto", { NULL, 0 }, NULL }, > { "overlay-list-mapping-state", { NULL, 0 }, NULL }, > { "overlay-list-overlays", { NULL, 0 }, NULL }, > diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h > index 72e18c7..16887ae 100644 > --- a/gdb/mi/mi-cmds.h > +++ b/gdb/mi/mi-cmds.h > @@ -66,6 +66,7 @@ extern mi_cmd_argv_ftype mi_cmd_inferior_tty_set; > extern mi_cmd_argv_ftype mi_cmd_inferior_tty_show; > extern mi_cmd_argv_ftype mi_cmd_interpreter_exec; > extern mi_cmd_argv_ftype mi_cmd_list_features; > +extern mi_cmd_argv_ftype mi_cmd_list_target_features; > extern mi_cmd_argv_ftype mi_cmd_stack_info_depth; > extern mi_cmd_argv_ftype mi_cmd_stack_info_frame; > extern mi_cmd_argv_ftype mi_cmd_stack_list_args; > diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c > index 733fc47..b18326d 100644 > --- a/gdb/mi/mi-main.c > +++ b/gdb/mi/mi-main.c > @@ -915,7 +915,25 @@ mi_cmd_list_features (char *command,=20 > char **argv, int argc) >=20=20 > error ("-list-features should be passed no arguments"); > } > -=20 > + > +void > +mi_cmd_list_target_features (char *command, char **argv, int argc) > +{ > + if (argc =3D=3D 0) > + { > + struct cleanup *cleanup =3D NULL; > + cleanup =3D make_cleanup_ui_out_list_begin_end (uiout,=20 > "features");=20=20=20=20=20=20 > + > + if (target_can_async_p ()) > + ui_out_field_string (uiout, NULL, "async"); > +=20=20=20=20=20=20 > + do_cleanups (cleanup); > + return; > + } > + > + error ("-list-target-features should be passed no arguments"); > +} > + > /* Execute a command within a safe environment. > Return <0 for error; >=3D0 for ok. >=20=20 > diff --git a/gdb/remote.c b/gdb/remote.c > index 2782d05..af3b0b8 100644 > --- a/gdb/remote.c > +++ b/gdb/remote.c > @@ -209,33 +209,6 @@ static void=20 > show_remote_protocol_packet_cmd (struct ui_file *file, >=20=20 > void _initialize_remote (void); >=20=20 > -/* Controls if async mode is permitted. */ > -static int remote_async_permitted =3D 0; > - > -static int remote_async_permitted_set =3D 0; > - > -static void > -set_maintenance_remote_async_permitted (char *args, int from_tty, > - struct cmd_list_element *c) > -{ > - if (target_has_execution) > - { > - remote_async_permitted_set =3D remote_async_permitted;=20 > /* revert */ > - error (_("Cannot change this setting while the=20 > inferior is running.")); > - } > - > - remote_async_permitted =3D remote_async_permitted_set; > -} > - > -static void > -show_maintenance_remote_async_permitted (struct ui_file=20 > *file, int from_tty, > - struct=20 > cmd_list_element *c, const char *value) > -{ > - fprintf_filtered (file, _("\ > -Controlling the remote inferior in asynchronous mode is %s.\n"), > - value); > -} > - > /* For "remote". */ >=20=20 > static struct cmd_list_element *remote_cmdlist; > @@ -2703,7 +2676,7 @@ remote_open_1 (char *name, int=20 > from_tty, struct target_ops *target, int extended > "(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).")); >=20=20 > /* See FIXME above. */ > - if (!remote_async_permitted) > + if (!target_async_permitted) > wait_forever_enabled_p =3D 1; >=20=20 > /* If we're connected to a running target, target_preopen=20 > will kill it. > @@ -2824,7 +2797,7 @@ remote_open_1 (char *name, int=20 > from_tty, struct target_ops *target, int extended > this before anything involving memory or registers. */ > target_find_description (); >=20=20 > - if (remote_async_permitted) > + if (target_async_permitted) > { > /* With this target we start out by owning the terminal. */ > remote_async_terminal_ours_p =3D 1; > @@ -2869,13 +2842,13 @@ remote_open_1 (char *name, int=20 > from_tty, struct target_ops *target, int extended > if (ex.reason < 0) > { > pop_target (); > - if (remote_async_permitted) > + if (target_async_permitted) > wait_forever_enabled_p =3D 1; > throw_exception (ex); > } > } >=20=20 > - if (remote_async_permitted) > + if (target_async_permitted) > wait_forever_enabled_p =3D 1; >=20=20 > if (extended_p) > @@ -3403,7 +3376,7 @@ Give up (and stop debugging it)? ")) > static void > remote_terminal_inferior (void) > { > - if (!remote_async_permitted) > + if (!target_async_permitted) > /* Nothing to do. */ > return; >=20=20 > @@ -3433,7 +3406,7 @@ remote_terminal_inferior (void) > static void > remote_terminal_ours (void) > { > - if (!remote_async_permitted) > + if (!target_async_permitted) > /* Nothing to do. */ > return; >=20=20 > @@ -7265,7 +7238,7 @@ Specify the serial device it is=20 > connected to (e.g. /dev/ttya)."; > static int > remote_can_async_p (void) > { > - if (!remote_async_permitted) > + if (!target_async_permitted) > /* We only enable async when the user specifically asks=20 > for it. */ > return 0; >=20=20 > @@ -7276,7 +7249,7 @@ remote_can_async_p (void) > static int > remote_is_async_p (void) > { > - if (!remote_async_permitted) > + if (!target_async_permitted) > /* We only enable async when the user specifically asks=20 > for it. */ > return 0; >=20=20 > @@ -7630,17 +7603,6 @@ Set the remote pathname for \"run\""), _("\ > Show the remote pathname for \"run\""), NULL, NULL, NULL, > &remote_set_cmdlist,=20 > &remote_show_cmdlist); >=20=20 > - add_setshow_boolean_cmd ("remote-async", class_maintenance, > - &remote_async_permitted_set, _("\ > -Set whether gdb controls the remote inferior in asynchronous=20 > mode."), _("\ > -Show whether gdb controls the remote inferior in=20 > asynchronous mode."), _("\ > -Tells gdb whether to control the remote inferior in=20 > asynchronous mode."), > - set_maintenance_remote_async_permitted, > - show_maintenance_remote_async_permitted, > - &maintenance_set_cmdlist, > - &maintenance_show_cmdlist); > - > - > /* Eventually initialize fileio. See fileio.c */ > initialize_remote_fileio (remote_set_cmdlist, remote_show_cmdlist); >=20=20 > diff --git a/gdb/target.c b/gdb/target.c > index 6cda095..0dbe49b 100644 > --- a/gdb/target.c > +++ b/gdb/target.c > @@ -3136,6 +3136,35 @@ maintenance_print_target_stack (char=20 > *cmd, int from_tty) > } > } >=20=20 > +/* Controls if async mode is permitted. */ > +int target_async_permitted =3D 0; > + > +/* The set command writes to this variable. If the inferior is > + executing, linux_nat_async_permitted is *not* updated. */ > +static int target_async_permitted_1 =3D 0; > + > +static void > +set_maintenance_target_async_permitted (char *args, int from_tty, > + struct cmd_list_element *c) > +{ > + if (target_has_execution) > + { > + target_async_permitted_1 =3D target_async_permitted; > + error (_("Cannot change this setting while the=20 > inferior is running.")); > + } > + > + target_async_permitted =3D target_async_permitted_1; > +} > + > +static void > +show_maintenance_target_async_permitted (struct ui_file=20 > *file, int from_tty, > + struct cmd_list_element *c, > + const char *value) > +{ > + fprintf_filtered (file, _("\ > +Controlling the inferior in asynchronous mode is %s.\n"), value); > +} > + > void > initialize_targets (void) > { > @@ -3173,5 +3202,15 @@ result in significant performance=20 > improvement for remote targets."), > _("Print the name of each layer of the internal=20 > target stack."), > &maintenanceprintlist); >=20=20 > + add_setshow_boolean_cmd ("target-async", no_class, > + &target_async_permitted_1, _("\ > +Set whether gdb controls the inferior in asynchronous mode."), _("\ > +Show whether gdb controls the inferior in asynchronous mode."), _("\ > +Tells gdb whether to control the inferior in asynchronous mode."), > + set_maintenance_target_async_permitted, > + show_maintenance_target_async_permitted, > + &setlist, > + &showlist); > + > target_dcache =3D dcache_init (); > } > diff --git a/gdb/target.h b/gdb/target.h > index e242566..3a1d4b7 100644 > --- a/gdb/target.h > +++ b/gdb/target.h > @@ -956,6 +956,10 @@ int target_follow_fork (int follow_child); > #define target_can_lock_scheduler \ > (current_target.to_has_thread_control & tc_schedlock) >=20=20 > +/* Should the target enable async mode if it is supported? Temporary > + cludge until async mode is a strict superset of sync mode. */ > +extern int target_async_permitted; > + > /* Can the target support asynchronous execution? */ > #define target_can_async_p() (current_target.to_can_async_p ()) >=20=20 > diff --git a/gdb/testsuite/gdb.mi/mi-async.exp=20 > b/gdb/testsuite/gdb.mi/mi-async.exp > index 9ac91fd..a251c32 100644 > --- a/gdb/testsuite/gdb.mi/mi-async.exp > +++ b/gdb/testsuite/gdb.mi/mi-async.exp > @@ -27,7 +27,7 @@ if { !([isnative] && [istarget *-linux*]) \ >=20=20 > # The plan is for async mode to become the default but=20 > toggle for now. > set saved_gdbflags $GDBFLAGS > -set GDBFLAGS [concat $GDBFLAGS " -ex \"maint set linux-async on\""] > +set GDBFLAGS [concat $GDBFLAGS " -ex \"set target-async on\""] >=20=20 > load_lib mi-support.exp >=20=20 > diff --git a/gdb/testsuite/lib/mi-support.exp=20 > b/gdb/testsuite/lib/mi-support.exp > index 762e4e2..09d3eeb 100644 > --- a/gdb/testsuite/lib/mi-support.exp > +++ b/gdb/testsuite/lib/mi-support.exp > @@ -912,10 +912,10 @@ proc detect_async {} { > global async > global mi_gdb_prompt >=20=20 > - send_gdb "maint show linux-async\n" > + send_gdb "show target-async\n" >=20=20=20=20=20=20=20=20=20=20 > gdb_expect { > - -re ".*Controlling the GNU/Linux inferior in=20 > asynchronous mode is on...*$mi_gdb_prompt$" { > + -re ".*Controlling the inferior in asynchronous mode=20 > is on...*$mi_gdb_prompt$" { > set async 1 > } > -re ".*$mi_gdb_prompt$" { > --=20 > 1.5.3.5 >=20 >=20