From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10083 invoked by alias); 17 Mar 2008 15:48:43 -0000 Received: (qmail 10072 invoked by uid 22791); 17 Mar 2008 15:48:42 -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 15:48:17 +0000 Received: (qmail 5617 invoked from network); 17 Mar 2008 15:48:12 -0000 Received: from unknown (HELO orlando) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 17 Mar 2008 15:48:12 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: attach& support, and attach "async + sync_execution" support. Date: Mon, 17 Mar 2008 15:48:00 -0000 User-Agent: KMail/1.9.6 (enterprise 0.20070907.709405) References: <200803140805.40116.pedro@codesourcery.com> <20080314191821.GG31663@caradoc.them.org> In-Reply-To: <20080314191821.GG31663@caradoc.them.org> MIME-Version: 1.0 Message-Id: <200803171548.09531.pedro@codesourcery.com> Content-Type: Multipart/Mixed; boundary="Boundary-00=_5Kp3HiMaTLzQmRh" 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/msg00230.txt.bz2 --Boundary-00=_5Kp3HiMaTLzQmRh Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1306 A Friday 14 March 2008 19:18:21, Daniel Jacobowitz wrote: > Could you do some refactoring on this, please? It duplicates code > from attach_command. When I fixed up step last year I moved the > common code into its own function. Makes it much easier to see > the differences between async and sync operation. And for instance > it lets me see that you're calling deprecated_attach_hook twice > in async mode :-) I don't think I was :-) There were three different exit points. sync, async/sync_execution, and true async. I've reverted the bits that immediatelly proceed after attaching, and defered it to the continuation (for the attach& support). I'll look into short-circuiting that again when non-stop is in. The attach& mode is still supported, but we wait for everything to be stopped and stable before deciding to proceed or normal_stop. This is look alright? Tested on x86_64-unknown-linux-gnu with the linux async support (new patch follows) enabled and disabled. -- Pedro Alves (P.S. Am I the only one that thinks that continuation arguments suck? IMHO, we should move the continuation_arg data union into the continuation proper, and force people to use structs for the compound args. Oh, and who is responsible for freeing the continuation args? Nobody seems to be doing that.) --Boundary-00=_5Kp3HiMaTLzQmRh 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: 5942 2008-03-14 Pedro Alves * infcmd.c (attach_command_post_wait, attach_command_continuation): New. (attach_command): Support background async execution, and async execution in synchronous mode. --- gdb/infcmd.c | 152 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 110 insertions(+), 42 deletions(-) Index: src/gdb/infcmd.c =================================================================== --- src.orig/gdb/infcmd.c 2008-03-17 14:55:00.000000000 +0000 +++ src/gdb/infcmd.c 2008-03-17 15:13:04.000000000 +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. - - 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)); + /* sync_execution mode. Wait for stop. */ + struct continuation_arg *arg1, *arg2, *arg3; - 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=_5Kp3HiMaTLzQmRh--