X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Finflow.c;h=1456fd805dce2a3dcf21d6663493a2814f67ecdf;hb=749bab0110ddc56835bfe70765675577e3dea05a;hp=79a99d1315a697600e4e9317d72fe6065f44886d;hpb=503ebb2c1de7f1710f8f9633feb60821f6aac552;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/inflow.c b/gdb/inflow.c index 79a99d1315..1456fd805d 100644 --- a/gdb/inflow.c +++ b/gdb/inflow.c @@ -1,5 +1,5 @@ /* Low level interface to ptrace, for GDB when running under Unix. - Copyright (C) 1986-2013 Free Software Foundation, Inc. + Copyright (C) 1986-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -25,8 +25,6 @@ #include "target.h" #include "gdbthread.h" #include "observer.h" - -#include "gdb_string.h" #include #include #include "gdb_select.h" @@ -46,7 +44,7 @@ extern void _initialize_inflow (void); static void pass_signal (int); -static void terminal_ours_1 (int); +static void child_terminal_ours_1 (int); /* Record terminal status separately for debugger and inferior. */ @@ -81,6 +79,10 @@ struct terminal_info unimportant. */ static struct terminal_info our_terminal_info; +/* Snapshot of our own tty state taken during initialization of GDB. + This is used as the initial tty state given to each new inferior. */ +static serial_ttystate initial_gdb_ttystate; + static struct terminal_info *get_inflow_inferior_data (struct inferior *); #ifdef PROCESS_GROUP_TYPE @@ -158,6 +160,14 @@ show_interactive_mode (struct ui_file *file, int from_tty, fprintf_filtered (file, "Debugger's interactive mode is %s.\n", value); } +/* Set the initial tty state that is to be inherited by new inferiors. */ + +void +set_initial_gdb_ttystate (void) +{ + initial_gdb_ttystate = serial_get_tty_state (stdin_serial); +} + /* Does GDB have a terminal (on stdin)? */ int gdb_has_a_terminal (void) @@ -209,26 +219,27 @@ gdb_has_a_terminal (void) fprintf_unfiltered(gdb_stderr, "[%s failed in terminal_inferior: %s]\n", \ what, safe_strerror (errno)) -static void terminal_ours_1 (int); - /* Initialize the terminal settings we record for the inferior, before we actually run the inferior. */ void -terminal_init_inferior_with_pgrp (int pgrp) +child_terminal_init_with_pgrp (int pgrp) { + struct inferior *inf = current_inferior (); + struct terminal_info *tinfo = get_inflow_inferior_data (inf); + +#ifdef PROCESS_GROUP_TYPE + /* Store the process group even without a terminal as it is used not + only to reset the tty foreground process group, but also to + interrupt the inferior. */ + tinfo->process_group = pgrp; +#endif + if (gdb_has_a_terminal ()) { - struct inferior *inf = current_inferior (); - struct terminal_info *tinfo = get_inflow_inferior_data (inf); - xfree (tinfo->ttystate); tinfo->ttystate = serial_copy_tty_state (stdin_serial, - our_terminal_info.ttystate); - -#ifdef PROCESS_GROUP_TYPE - tinfo->process_group = pgrp; -#endif + initial_gdb_ttystate); /* Make sure that next time we call terminal_inferior (which will be before the program runs, as it needs to be), we install the new @@ -242,7 +253,7 @@ terminal_init_inferior_with_pgrp (int pgrp) and gdb must be able to restore it correctly. */ void -terminal_save_ours (void) +gdb_save_tty_state (void) { if (gdb_has_a_terminal ()) { @@ -252,24 +263,28 @@ terminal_save_ours (void) } void -terminal_init_inferior (void) +child_terminal_init (struct target_ops *self) { #ifdef PROCESS_GROUP_TYPE - /* This is for Lynx, and should be cleaned up by having Lynx be a separate - debugging target with a version of target_terminal_init_inferior which - passes in the process group to a generic routine which does all the work - (and the non-threaded child_terminal_init_inferior can just pass in - inferior_ptid to the same routine). */ + /* This is for Lynx, and should be cleaned up by having Lynx be a + separate debugging target with a version of target_terminal_init + which passes in the process group to a generic routine which does + all the work (and the non-threaded child_terminal_init can just + pass in inferior_ptid to the same routine). */ /* We assume INFERIOR_PID is also the child's process group. */ - terminal_init_inferior_with_pgrp (PIDGET (inferior_ptid)); + child_terminal_init_with_pgrp (ptid_get_pid (inferior_ptid)); #endif /* PROCESS_GROUP_TYPE */ } /* Put the inferior's terminal settings into effect. - This is preparation for starting or resuming the inferior. */ + This is preparation for starting or resuming the inferior. + + N.B. Targets that want to use this with async support must build that + support on top of this (e.g., the caller still needs to remove stdin + from the event loop). E.g., see linux_nat_terminal_inferior. */ void -terminal_inferior (void) +child_terminal_inferior (struct target_ops *self) { struct inferior *inf; struct terminal_info *tinfo; @@ -347,22 +362,29 @@ terminal_inferior (void) so that no input is discarded. After doing this, either terminal_ours or terminal_inferior - should be called to get back to a normal state of affairs. */ + should be called to get back to a normal state of affairs. + + N.B. The implementation is (currently) no different than + child_terminal_ours. See child_terminal_ours_1. */ void -terminal_ours_for_output (void) +child_terminal_ours_for_output (struct target_ops *self) { - terminal_ours_1 (1); + child_terminal_ours_1 (1); } /* Put our terminal settings into effect. First record the inferior's terminal settings - so they can be restored properly later. */ + so they can be restored properly later. + + N.B. Targets that want to use this with async support must build that + support on top of this (e.g., the caller still needs to add stdin to the + event loop). E.g., see linux_nat_terminal_ours. */ void -terminal_ours (void) +child_terminal_ours (struct target_ops *self) { - terminal_ours_1 (0); + child_terminal_ours_1 (0); } /* output_only is not used, and should not be used unless we introduce @@ -370,7 +392,7 @@ terminal_ours (void) flags. */ static void -terminal_ours_1 (int output_only) +child_terminal_ours_1 (int output_only) { struct inferior *inf; struct terminal_info *tinfo; @@ -443,7 +465,7 @@ terminal_ours_1 (int output_only) such situations as well. */ if (result == -1) fprintf_unfiltered (gdb_stderr, - "[tcsetpgrp failed in terminal_ours: %s]\n", + "[tcsetpgrp failed in child_terminal_ours: %s]\n", safe_strerror (errno)); #endif #endif /* termios */ @@ -484,15 +506,11 @@ static const struct inferior_data *inflow_inferior_data; static void inflow_inferior_data_cleanup (struct inferior *inf, void *arg) { - struct terminal_info *info; + struct terminal_info *info = arg; - info = inferior_data (inf, inflow_inferior_data); - if (info != NULL) - { - xfree (info->run_terminal); - xfree (info->ttystate); - xfree (info); - } + xfree (info->run_terminal); + xfree (info->ttystate); + xfree (info); } /* Get the current svr4 data. If none is found yet, add it now. This @@ -506,7 +524,7 @@ get_inflow_inferior_data (struct inferior *inf) info = inferior_data (inf, inflow_inferior_data); if (info == NULL) { - info = XZALLOC (struct terminal_info); + info = XCNEW (struct terminal_info); set_inferior_data (inf, inflow_inferior_data, info); } @@ -563,7 +581,7 @@ term_info (char *arg, int from_tty) } void -child_terminal_info (const char *args, int from_tty) +child_terminal_info (struct target_ops *self, const char *args, int from_tty) { struct inferior *inf; struct terminal_info *tinfo; @@ -766,7 +784,7 @@ static void pass_signal (int signo) { #ifndef _WIN32 - kill (PIDGET (inferior_ptid), SIGINT); + kill (ptid_get_pid (inferior_ptid), SIGINT); #endif }