From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9843 invoked by alias); 17 Mar 2008 17:35:25 -0000 Received: (qmail 9201 invoked by uid 22791); 17 Mar 2008 17:35:01 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 17 Mar 2008 17:34:44 +0000 Received: (qmail 10148 invoked from network); 17 Mar 2008 17:34:39 -0000 Received: from unknown (HELO orlando) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 17 Mar 2008 17:34:39 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: attach& support, and attach "async + sync_execution" support. Date: Mon, 17 Mar 2008 17:35:00 -0000 User-Agent: KMail/1.9.6 (enterprise 0.20070907.709405) References: <200803140805.40116.pedro@codesourcery.com> <200803171548.09531.pedro@codesourcery.com> <20080317161758.GA13212@caradoc.them.org> In-Reply-To: <20080317161758.GA13212@caradoc.them.org> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_wuq3HgLwIsfDWlc" Message-Id: <200803171734.40014.pedro@codesourcery.com> 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-03/txt/msg00235.txt.bz2 --Boundary-00=_wuq3HgLwIsfDWlc Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1066 A Monday 17 March 2008 16:17:58, Daniel Jacobowitz wrote: > On Mon, Mar 17, 2008 at 03:48:09PM +0000, Pedro Alves wrote: > > + if (args) > > + { > > + async_exec = strip_bg_char (&args); > > + > > + /* If we get a request for running in the bg but the target > > + doesn't support it, error out. */ > > + if (async_exec && !target_can_async_p ()) > > + error (_("Asynchronous execution not supported on this target.")); > > + > > + /* If we don't get a request of running in the bg, then we need > > + to simulate synchronous (fg) execution. */ > > + if (!async_exec && target_can_async_p ()) > > + { > > + /* Simulate synchronous execution */ > > + async_disable_stdin (); > > + } > > + } > > This logic will work, since args should never be NULL anyway, but the > call to async_disable_stdin is not dependent on args I think? > You're right, it's not. Although this would only break if a target has some sort of default pid to attach to. > Otherwise OK. Thanks! This is what I checked in. -- Pedro Alves --Boundary-00=_wuq3HgLwIsfDWlc Content-Type: text/x-diff; charset="iso-8859-1"; name="attach_async_support.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="attach_async_support.diff" Content-length: 6276 Index: ChangeLog =================================================================== RCS file: /cvs/src/src/gdb/ChangeLog,v retrieving revision 1.9231 diff -u -p -r1.9231 ChangeLog --- ChangeLog 17 Mar 2008 15:05:42 -0000 1.9231 +++ ChangeLog 17 Mar 2008 17:29:52 -0000 @@ -1,3 +1,10 @@ +2008-03-17 Pedro Alves + + * infcmd.c (attach_command_post_wait) + (attach_command_continuation): New. + (attach_command): Support background async execution, and async + execution in synchronous mode. + 2008-03-17 Daniel Jacobowitz * stack.c (print_stack_frame, print_frame): Use RETURN_MASK_ERROR. Index: infcmd.c =================================================================== RCS file: /cvs/src/src/gdb/infcmd.c,v retrieving revision 1.173 diff -u -p -r1.173 infcmd.c --- infcmd.c 14 Mar 2008 23:24:53 -0000 1.173 +++ infcmd.c 17 Mar 2008 17:29:53 -0000 @@ -1875,11 +1875,83 @@ vector_info (char *args, int from_tty) This stops it cold in its tracks and allows us to start debugging it. and wait for the trace-trap that results from attaching. */ +static void +attach_command_post_wait (char *args, int from_tty, int async_exec) +{ + char *exec_file; + char *full_exec_path = NULL; + + stop_soon = NO_STOP_QUIETLY; + + /* If no exec file is yet known, try to determine it from the + process itself. */ + exec_file = (char *) get_exec_file (0); + if (!exec_file) + { + exec_file = target_pid_to_exec_file (PIDGET (inferior_ptid)); + if (exec_file) + { + /* It's possible we don't have a full path, but rather just a + filename. Some targets, such as HP-UX, don't provide the + full path, sigh. + + Attempt to qualify the filename against the source path. + (If that fails, we'll just fall back on the original + filename. Not much more we can do...) + */ + if (!source_full_path_of (exec_file, &full_exec_path)) + full_exec_path = savestring (exec_file, strlen (exec_file)); + + exec_file_attach (full_exec_path, from_tty); + symbol_file_add_main (full_exec_path, from_tty); + } + } + else + { + reopen_exec_file (); + reread_symbols (); + } + + /* Take any necessary post-attaching actions for this platform. */ + target_post_attach (PIDGET (inferior_ptid)); + + post_create_inferior (¤t_target, from_tty); + + /* Install inferior's terminal modes. */ + target_terminal_inferior (); + + if (async_exec) + proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0); + else + { + if (target_can_async_p ()) + async_enable_stdin (); + normal_stop (); + if (deprecated_attach_hook) + deprecated_attach_hook (); + } +} + +static void +attach_command_continuation (struct continuation_arg *arg) +{ + char *args; + int from_tty; + int async_exec; + + args = (char *) arg->data.pointer; + from_tty = arg->next->data.integer; + async_exec = arg->next->next->data.integer; + + attach_command_post_wait (args, from_tty, async_exec); +} + void attach_command (char *args, int from_tty) { char *exec_file; char *full_exec_path = NULL; + int async_exec = 0; dont_repeat (); /* Not for the faint of heart */ @@ -1913,6 +1985,24 @@ attach_command (char *args, int from_tty */ clear_solib (); + if (args) + { + async_exec = strip_bg_char (&args); + + /* If we get a request for running in the bg but the target + doesn't support it, error out. */ + if (async_exec && !target_can_async_p ()) + error (_("Asynchronous execution not supported on this target.")); + } + + /* If we don't get a request of running in the bg, then we need + to simulate synchronous (fg) execution. */ + if (!async_exec && target_can_async_p ()) + { + /* Simulate synchronous execution */ + async_disable_stdin (); + } + target_attach (args, from_tty); /* Set up the "saved terminal modes" of the inferior @@ -1932,54 +2022,32 @@ attach_command (char *args, int from_tty way for handle_inferior_event to reset the stop_signal variable after an attach, and this is what STOP_QUIETLY_NO_SIGSTOP is for. */ stop_soon = STOP_QUIETLY_NO_SIGSTOP; - wait_for_inferior (0); - stop_soon = NO_STOP_QUIETLY; -#endif - /* - * If no exec file is yet known, try to determine it from the - * process itself. - */ - exec_file = (char *) get_exec_file (0); - if (!exec_file) + if (target_can_async_p ()) { - exec_file = target_pid_to_exec_file (PIDGET (inferior_ptid)); - if (exec_file) - { - /* It's possible we don't have a full path, but rather just a - filename. Some targets, such as HP-UX, don't provide the - full path, sigh. + /* sync_execution mode. Wait for stop. */ + struct continuation_arg *arg1, *arg2, *arg3; - Attempt to qualify the filename against the source path. - (If that fails, we'll just fall back on the original - filename. Not much more we can do...) - */ - if (!source_full_path_of (exec_file, &full_exec_path)) - full_exec_path = savestring (exec_file, strlen (exec_file)); - - exec_file_attach (full_exec_path, from_tty); - symbol_file_add_main (full_exec_path, from_tty); - } + arg1 = + (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg)); + arg2 = + (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg)); + arg3 = + (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg)); + arg1->next = arg2; + arg2->next = arg3; + arg3->next = NULL; + arg1->data.pointer = args; + arg2->data.integer = from_tty; + arg3->data.integer = async_exec; + add_continuation (attach_command_continuation, arg1); + return; } - else - { - reopen_exec_file (); - reread_symbols (); - } - - /* Take any necessary post-attaching actions for this platform. - */ - target_post_attach (PIDGET (inferior_ptid)); - - post_create_inferior (¤t_target, from_tty); - /* Install inferior's terminal modes. */ - target_terminal_inferior (); - - normal_stop (); + wait_for_inferior (0); +#endif - if (deprecated_attach_hook) - deprecated_attach_hook (); + attach_command_post_wait (args, from_tty, async_exec); } /* --Boundary-00=_wuq3HgLwIsfDWlc--