X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fevent-top.c;h=833f49db08b568c735b68e1f244d6fe00b303eec;hb=976411d6b6aa5cae05259eb92b87a04262052e09;hp=bd92ef1cd284d6fa198d4835c167483d4ca14c6b;hpb=460014f572f44fe3e8deb146cb92fd312c4c3339;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/event-top.c b/gdb/event-top.c index bd92ef1cd2..833f49db08 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -1,6 +1,6 @@ /* Top level stuff for GDB, the GNU debugger. - Copyright (C) 1999-2013 Free Software Foundation, Inc. + Copyright (C) 1999-2014 Free Software Foundation, Inc. Written by Elena Zannoni of Cygnus Solutions. @@ -22,6 +22,7 @@ #include "defs.h" #include "top.h" #include "inferior.h" +#include "infrun.h" #include "target.h" #include "terminal.h" /* for job_control */ #include "event-loop.h" @@ -36,6 +37,7 @@ #include "continuations.h" #include "gdbcmd.h" /* for dont_repeat() */ #include "annotate.h" +#include "maint.h" /* readline include files. */ #include "readline/readline.h" @@ -71,6 +73,7 @@ static void async_float_handler (gdb_client_data); #ifdef STOP_SIGNAL static void async_stop_sig (gdb_client_data); #endif +static void async_sigterm_handler (gdb_client_data arg); /* Readline offers an alternate interface, via callback functions. These are all included in the file callback.c in the @@ -134,6 +137,7 @@ static struct async_signal_handler *sigfpe_token; #ifdef STOP_SIGNAL static struct async_signal_handler *sigtstp_token; #endif +static struct async_signal_handler *async_sigterm_token; /* Structure to save a partially entered command. This is used when the user types '\' at the end of a command line. This is necessary @@ -166,9 +170,11 @@ rl_callback_read_char_wrapper (gdb_client_data client_data) } /* Initialize all the necessary variables, start the event loop, - register readline, and stdin, start the loop. */ + register readline, and stdin, start the loop. The DATA is the + interpreter data cookie, ignored for now. */ + void -cli_command_loop (void) +cli_command_loop (void *data) { display_gdb_prompt (0); @@ -237,11 +243,6 @@ display_gdb_prompt (char *new_prompt) /* Reset the nesting depth used when trace-commands is set. */ reset_command_nest_depth (); - /* Each interpreter has its own rules on displaying the command - prompt. */ - if (!current_interp_display_prompt_p ()) - return; - old_chain = make_cleanup (free_current_contents, &actual_gdb_prompt); /* Do not call the python hook on an explicit prompt change as @@ -268,6 +269,7 @@ display_gdb_prompt (char *new_prompt) rl_callback_handler_remove(), does the job. */ rl_callback_handler_remove (); + do_cleanups (old_chain); return; } else @@ -602,8 +604,7 @@ command_line_handler (char *rl) *p = 0; /* Add line to history if appropriate. */ - if (instream == stdin - && ISATTY (stdin) && *linebuffer) + if (*linebuffer && input_from_terminal_p ()) add_history (linebuffer); /* Note: lines consisting solely of comments are added to the command @@ -730,6 +731,8 @@ async_init_signals (void) sigint_token = create_async_signal_handler (async_request_quit, NULL); signal (SIGTERM, handle_sigterm); + async_sigterm_token + = create_async_signal_handler (async_sigterm_handler, NULL); /* If SIGTRAP was set to SIG_IGN, then the SIG_IGN will get passed to the inferior and breakpoints will be ignored. */ @@ -766,7 +769,6 @@ async_init_signals (void) sigtstp_token = create_async_signal_handler (async_stop_sig, NULL); #endif - } /* Tell the event loop what to do if SIGINT is received. @@ -794,13 +796,33 @@ handle_sigint (int sig) gdb_call_async_signal_handler (sigint_token, immediate_quit); } +/* Handle GDB exit upon receiving SIGTERM if target_can_async_p (). */ + +static void +async_sigterm_handler (gdb_client_data arg) +{ + quit_force (NULL, stdin == instream); +} + +/* See defs.h. */ +volatile int sync_quit_force_run; + /* Quit GDB if SIGTERM is received. GDB would quit anyway, but this way it will clean up properly. */ void handle_sigterm (int sig) { signal (sig, handle_sigterm); - quit_force ((char *) 0, stdin == instream); + + /* Call quit_force in a signal safe way. + quit_force itself is not signal safe. */ + if (target_can_async_p ()) + mark_async_signal_handler (async_sigterm_token); + else + { + sync_quit_force_run = 1; + set_quit_flag (); + } } /* Do the quit. All the checks have been done by the caller. */ @@ -953,7 +975,7 @@ gdb_setup_readline (void) time. */ if (!batch_silent) gdb_stdout = stdio_fileopen (stdout); - gdb_stderr = stdio_fileopen (stderr); + gdb_stderr = stderr_fileopen (); gdb_stdlog = gdb_stderr; /* for moment */ gdb_stdtarg = gdb_stderr; /* for moment */ gdb_stdtargerr = gdb_stderr; /* for moment */