This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
> We've branched; you have a patch ready; let's get it going! I'd be > glad to see this merged. I'm afraid I really haven't looked at what > you have so far; could you post a current patch that I can experiment > with? I'm attaching it below. To run testsuite with asynchronous event loop put the line: set GDBFLAGS "--async" at the bottom of site.exp. I've taken nearly all the MI changes out but running MI is still one good way of checking asynchronous behaviour: synchronous: n &"n\n" ~"70\t int n1 = 7, n2 = 8, n3 = 9;\n" ^done (gdb) asynchronous: n &"n\n" ^running ^done (gdb) *stopped,reason="end-stepping-range",thread-id="0",frame={addr="0x080485bb",func="main",args=[],file="myprog.c",fullname="/home/nickrob/myprog.c",line="70"} (gdb) I've created a new testfile (below) for this kind of thing. > I'll try to look at it during this week. Thanks. It's probably still a bit rough but if you can tell me what to do I'll clean it up/make it more general. > > I'll ask RMS, I've always been told that the committer's name should not be > > the one to go in the changelog. > > True, but you've updated the patch and in general done more work on it; That's true. I've tried to put my changes at the top of the changelog and pure Apple at the bottom prefixed with "copied verbatim" i.e idiot fashion where I probably don't really know what is going on. -- Nick http://www.inet.net.nz/~nickrob 2006-11-21 Nick Roberts <nickrob@snap.net.nz> * defs.h (async_signal_hook): Declare. (event_loop_p): New extern. (deprecated_command_loop_hook): Make argument type void*. * main.c (captured_main, print_gdb_help): Add and describe --async option conditional on macro ASYNC. (event_loop_p): New global variable. * event-loop.c (async_signal_hook): New function pointer. (gdb_wait_for_event): Use it. * linux-nat.c: Include inf-loop.h. Include poll.h conditionally. (gdb_post_startup): New extern. (gdb_status, gdb_file_event): New variables. (async_mask, old_mask, async_action, old_action): New variables. (linux_nat_attach, linux_nat_detach): Condition on target_can_async_p. (linux_nat_resume): Add async file handler if necessary. (linux_nat_fetch_event): New function. (linux_nat_wait): Use it when asynchronous. (async_sigchld_handler, linux_nat_signal_hook): New functions. (_initialize_linux_nat): Set up signal handling and pipe for asynchronous behaviour. * infrun.c: Include event-top.h. (sync_execution): Set sync_execution to 1 initially. (proceed): Set target_executing to 0 if synchronous. (handle_inferior_event): Print process switching for MI(?). Don't call context_switch (ecs) or flush_cached_frames (). Use local variable was_sync_execution. * inf-ptrace.c: Include inf-loop.h, event-loop.h and event-top.h. (standard_is_async_p, standard_can_async_p) (initialize_sigint_signal_handler): New externs. (async_client_context, async_terminal_ours_p): New variables. (async_file_handler, inf_ptrace_async): New functions. (inf_ptrace_him): Use gdb_post_startup as a flag. (inf_ptrace_mourn_inferior): Don't call waitpid if asynchronous. (inf_ptrace_attach): Set gdb_post_startup. Call wait_for_inferior if asynchronous. (async_terminal_inferior): New function. (inf_ptrace_target): Add methods if asynchronous. * exec.c (standard_async, standard_is_async_p, standard_can_async_p): New functions. (init_exec_ops): Initialise above methods if GDB is invoked with --async. * infcmd.c (jump_command): Call async_disable_stdin if necessary before decode_line_spec_1. (attach_command): Make attach work asynchronously. (copied verbatim) * event-top.h (cli_command_loop): Make argument type void*. (copied verbatim) * event-top.c (cli_command_loop): Make argument void*. (display_gdb_prompt, async_enable_stdin) (async_disable_stdin, handle_sigint, async_request_quit) (gdb_setup_readline, _initialize_event_loop): Changes for asynchronous operation. (copied verbatim) * interps.c (interp_set): Make type struct interp *. Don't do_all_continuations or call clear_interpreter_hooks. (current_interp_command_loop): Call command_loop with NULL argument. (interp_set_quiet): Don't make static. (copied verbatim) * interps.h (interp_set, interp_set_quiet): New externs. (copied verbatim) * inf-loop.c (inferior_event_handler, complete_execution): Changes for asynchronous operation. (copied verbatim) * cli/cli-interp.c (cli_interpreter_resume): Set sync_execution. (safe_execute_command): Don't make it static. (_initialize_cli_interp): Add cli_command_loop to interp_procs structure. (copied verbatim) * wrapper.h (safe_execute_command): Declare here. (copied verbatim) * remote.c (cleanup_sigint_signal_handler) (initialize_sigint_signal_handler): Don't make static. (copied verbatim) * top.c (deprecated_command_loop_hook): Make argument type void*. (copied verbatim) * mi/mi-interp.c (mi1_command_loop, mi2_command_loop) (mi3_command_loop): Make argument type void*. * config/i386/nm-linux.h: Add ASYNC macro definition. * Makefile.in (inf-ptrace.o, infrun.o, linux-nat.o) (cli-interp.o): Add new header dependencies. ChangeLog | 102 +++++++++++++++++++++++++++ Makefile.in | 9 !! cli/cli-interp.c | 11 -! config/i386/nm-linux.h | 3 defs.h | 6 + event-loop.c | 15 ++++ event-top.c | 93 ++++++++++++++!!!!!!!!!!! event-top.h | 2 exec.c | 26 ++++++- inf-loop.c | 46 ++++++!!!!!! inf-ptrace.c | 101 ++++++++++++++++++++++++++! infcmd.c | 25 ++--!! infrun.c | 34 ++++---! interps.c | 40 +++!!!!!!! interps.h | 3 linux-nat.c | 181 +++++++++++++++++++++++++++++!!!!!!!!!!!!!!!!!!! main.c | 15 ++++ mi/mi-interp.c | 12 !!! remote.c | 8 !! top.c | 2 wrapper.h | 2 21 files changed, 490 insertions(+), 25 deletions(-), 221 modifications(!) # Copyright 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Test asynchronous Machine Interface (MI) operations # load_lib mi-support.exp set saved_gdbflags $GDBFLAGS set GDBFLAGS "-nw --async" set MIFLAGS "-i=mi" #set verbose 3 gdb_exit if [mi_gdb_start] { continue } set testfile "basics" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } { untested mi-async.exp return -1 } mi_delete_breakpoints mi_gdb_reinitialize_dir $srcdir/$subdir mi_gdb_load ${binfile} # mi_gdb_test cannot be used for asynchronous commands because there are # two prompts involved and this can lead to a race condition. proc linux_async_tests {} { global mi_gdb_prompt global hex set line_main_head [gdb_get_line_number "main ("] set line_main_body [expr $line_main_head + 2] set line_main_next [expr $line_main_head + 3] send_gdb "start\n" gdb_expect { -re ".*\\^running\r\n\\^done\r\n$mi_gdb_prompt" { gdb_expect { -re "\\*stopped,thread-id=\"0\",frame=\{addr=\"$hex\",func=\"main\",args=\\\[\\\],file=\".*basics.c\",line=\"$line_main_body\"\}\r\n$mi_gdb_prompt$" { pass "Asynchronous response after start command" } -re ".*$mi_gdb_prompt$" { fail "Asynchronous response after start command (2)" } timeout { fail "Asynchronous response after start command (timeout 2)" } } } -re ".*$mi_gdb_prompt$" { fail "Asynchronous response after start command (1)" } timeout {fail "Asynchronous response after start command (timeout 1)"} } send_gdb "next\n" gdb_expect { -re "\\^running\r\n\\^done\r\n$mi_gdb_prompt" { gdb_expect { -re "\\*stopped,reason=\"end-stepping-range\",thread-id=\"0\",frame=\{addr=\"$hex\",func=\"main\",args=\\\[\\\],file=\".*basics.c\",line=\"$line_main_next\"\}\r\n$mi_gdb_prompt$" { pass "Asynchronous response after next command" } -re ".*$mi_gdb_prompt$" { fail "Asynchronous response after next command (2)" } timeout { fail "Asynchronous response after next command (timeout 2)" } } } -re ".*$mi_gdb_prompt$" { fail "Asynchronous response after next command (1)" } timeout {fail "Asynchronous response after next command (timeout 1)"} } send_gdb "start\n" gdb_expect { -re ".*\\^running\r\n\\^done\r\n$mi_gdb_prompt" { gdb_expect { -re "\\*stopped,thread-id=\"0\",frame=\{addr=\"$hex\",func=\"main\",args=\\\[\\\],file=\".*basics.c\",line=\"$line_main_body\"\}\r\n$mi_gdb_prompt$" { pass "Asynchronous response after (re) start" } -re ".*$mi_gdb_prompt$" { fail "Asynchronous response after (re) start (2)" } timeout { fail "Asynchronous response after (re) start (timeout 2)" } } } -re ".*$mi_gdb_prompt$" { fail "Asynchronous response after (re) start (1)" } timeout {fail "Asynchronous response after (re) start (timeout 1)"} } } #if [istarget "i386-*-linux-gnu"] then { linux_async_tests #} mi_gdb_exit set GDBFLAGS $saved_gdbflags return 0
Attachment:
async5.diff.gz
Description: async without threads, handle SIGCHLD in gdb_wait_for_event.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |