From: Ulrich Weigand Date: Fri, 4 Mar 2011 19:23:42 +0000 (+0000) Subject: * inflow.c (terminal_init_inferior_with_pgrp): Copy ttystate. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1e182ce8c375de8f86fe00198b07d0331e4c4e0d;p=binutils-gdb.git * inflow.c (terminal_init_inferior_with_pgrp): Copy ttystate. (terminal_save_ours): Remove misleading comment. (inflow_inferior_data_cleanup): Free ttystate. (inflow_inferior_exit): Likewise. (copy_terminal_info): Copy ttystate. * serial.c (serial_copy_tty_state): New function. * serial.h (serial_copy_tty_state): Add prototype. (struct serial_ops): Add copy_tty_state callback. * ser-base.c (ser_base_copy_tty_state): New function. * ser-base.h (ser_base_copy_tty_state): Add prototype. * ser-go32.c (dos_copy_tty_state): New function. (dos_ops): Install copy_tty_state callback. * ser-mingw.c (_initialize_ser_windows): Likewise. * ser-pipe.c (_initialize_ser_pipe): Likewise. * ser-unix.c (hardwire_copy_tty_state): New function. (_initialize_ser_hardwire): Install it. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 12a6431b7ab..1311dc0d133 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,23 @@ +2011-03-04 Ulrich Weigand + + * inflow.c (terminal_init_inferior_with_pgrp): Copy ttystate. + (terminal_save_ours): Remove misleading comment. + (inflow_inferior_data_cleanup): Free ttystate. + (inflow_inferior_exit): Likewise. + (copy_terminal_info): Copy ttystate. + + * serial.c (serial_copy_tty_state): New function. + * serial.h (serial_copy_tty_state): Add prototype. + (struct serial_ops): Add copy_tty_state callback. + * ser-base.c (ser_base_copy_tty_state): New function. + * ser-base.h (ser_base_copy_tty_state): Add prototype. + * ser-go32.c (dos_copy_tty_state): New function. + (dos_ops): Install copy_tty_state callback. + * ser-mingw.c (_initialize_ser_windows): Likewise. + * ser-pipe.c (_initialize_ser_pipe): Likewise. + * ser-unix.c (hardwire_copy_tty_state): New function. + (_initialize_ser_hardwire): Install it. + 2011-03-04 Michael Snyder * breakpoint.c (create_breakpoint): Add missing break statement. diff --git a/gdb/inflow.c b/gdb/inflow.c index 99759049746..7876347daab 100644 --- a/gdb/inflow.c +++ b/gdb/inflow.c @@ -224,10 +224,9 @@ terminal_init_inferior_with_pgrp (int pgrp) struct inferior *inf = current_inferior (); struct terminal_info *tinfo = get_inflow_inferior_data (inf); - /* We could just as well copy our_ttystate (if we felt like - adding a new function serial_copy_tty_state()). */ xfree (tinfo->ttystate); - tinfo->ttystate = serial_get_tty_state (stdin_serial); + tinfo->ttystate = serial_copy_tty_state (stdin_serial, + our_terminal_info.ttystate); #ifdef PROCESS_GROUP_TYPE tinfo->process_group = pgrp; @@ -249,8 +248,6 @@ terminal_save_ours (void) { if (gdb_has_a_terminal ()) { - /* We could just as well copy our_ttystate (if we felt like adding - a new function serial_copy_tty_state). */ xfree (our_terminal_info.ttystate); our_terminal_info.ttystate = serial_get_tty_state (stdin_serial); } @@ -495,6 +492,7 @@ inflow_inferior_data_cleanup (struct inferior *inf, void *arg) if (info != NULL) { xfree (info->run_terminal); + xfree (info->ttystate); xfree (info); } } @@ -532,6 +530,7 @@ inflow_inferior_exit (struct inferior *inf) if (info != NULL) { xfree (info->run_terminal); + xfree (info->ttystate); xfree (info); set_inferior_data (inf, inflow_inferior_data, NULL); } @@ -544,10 +543,19 @@ copy_terminal_info (struct inferior *to, struct inferior *from) tinfo_to = get_inflow_inferior_data (to); tinfo_from = get_inflow_inferior_data (from); + + xfree (tinfo_to->run_terminal); + xfree (tinfo_to->ttystate); + *tinfo_to = *tinfo_from; + if (tinfo_from->run_terminal) tinfo_to->run_terminal = xstrdup (tinfo_from->run_terminal); + + if (tinfo_from->ttystate) + tinfo_to->ttystate + = serial_copy_tty_state (stdin_serial, tinfo_from->ttystate); } void diff --git a/gdb/ser-base.c b/gdb/ser-base.c index 8f014d0d9c2..368afa63315 100644 --- a/gdb/ser-base.c +++ b/gdb/ser-base.c @@ -463,6 +463,13 @@ ser_base_get_tty_state (struct serial *scb) return (serial_ttystate) XMALLOC (int); } +serial_ttystate +ser_base_copy_tty_state (struct serial *scb, serial_ttystate ttystate) +{ + /* Allocate another dummy. */ + return (serial_ttystate) XMALLOC (int); +} + int ser_base_set_tty_state (struct serial *scb, serial_ttystate ttystate) { diff --git a/gdb/ser-base.h b/gdb/ser-base.h index 6a06e04e3bc..8cbc22585dc 100644 --- a/gdb/ser-base.h +++ b/gdb/ser-base.h @@ -32,6 +32,8 @@ extern int ser_base_flush_input (struct serial *scb); extern int ser_base_send_break (struct serial *scb); extern void ser_base_raw (struct serial *scb); extern serial_ttystate ser_base_get_tty_state (struct serial *scb); +extern serial_ttystate ser_base_copy_tty_state (struct serial *scb, + serial_ttystate ttystate); extern int ser_base_set_tty_state (struct serial *scb, serial_ttystate ttystate); extern void ser_base_print_tty_state (struct serial *scb, diff --git a/gdb/ser-go32.c b/gdb/ser-go32.c index 44fea132b7e..835d8e05548 100644 --- a/gdb/ser-go32.c +++ b/gdb/ser-go32.c @@ -652,6 +652,17 @@ dos_get_tty_state (struct serial *scb) return (serial_ttystate) state; } +static serial_ttystate +dos_copy_tty_state (struct serial *scb, serial_ttystate ttystate) +{ + struct dos_ttystate *state; + + state = (struct dos_ttystate *) xmalloc (sizeof *state); + *state = *(struct dos_ttystate *) ttystate; + + return (serial_ttystate) state; +} + static int dos_set_tty_state (struct serial *scb, serial_ttystate ttystate) { @@ -851,6 +862,7 @@ static struct serial_ops dos_ops = dos_sendbreak, dos_raw, dos_get_tty_state, + dos_copy_tty_state, dos_set_tty_state, dos_print_tty_state, dos_noflush_set_tty_state, diff --git a/gdb/ser-mingw.c b/gdb/ser-mingw.c index 928a03bbc20..6de347177b9 100644 --- a/gdb/ser-mingw.c +++ b/gdb/ser-mingw.c @@ -1244,6 +1244,7 @@ _initialize_ser_windows (void) /* These are only used for stdin; we do not need them for serial ports, so supply the standard dummies. */ ops->get_tty_state = ser_base_get_tty_state; + ops->copy_tty_state = ser_base_copy_tty_state; ops->set_tty_state = ser_base_set_tty_state; ops->print_tty_state = ser_base_print_tty_state; ops->noflush_set_tty_state = ser_base_noflush_set_tty_state; @@ -1272,6 +1273,7 @@ _initialize_ser_windows (void) ops->close = ser_console_close; ops->get_tty_state = ser_console_get_tty_state; + ops->copy_tty_state = ser_base_copy_tty_state; ops->set_tty_state = ser_base_set_tty_state; ops->print_tty_state = ser_base_print_tty_state; ops->noflush_set_tty_state = ser_base_noflush_set_tty_state; @@ -1297,6 +1299,7 @@ _initialize_ser_windows (void) ops->send_break = ser_base_send_break; ops->go_raw = ser_base_raw; ops->get_tty_state = ser_base_get_tty_state; + ops->copy_tty_state = ser_base_copy_tty_state; ops->set_tty_state = ser_base_set_tty_state; ops->print_tty_state = ser_base_print_tty_state; ops->noflush_set_tty_state = ser_base_noflush_set_tty_state; @@ -1331,6 +1334,7 @@ _initialize_ser_windows (void) ops->send_break = ser_tcp_send_break; ops->go_raw = ser_base_raw; ops->get_tty_state = ser_base_get_tty_state; + ops->copy_tty_state = ser_base_copy_tty_state; ops->set_tty_state = ser_base_set_tty_state; ops->print_tty_state = ser_base_print_tty_state; ops->noflush_set_tty_state = ser_base_noflush_set_tty_state; diff --git a/gdb/ser-pipe.c b/gdb/ser-pipe.c index fd6650a27f4..9bf0d04f306 100644 --- a/gdb/ser-pipe.c +++ b/gdb/ser-pipe.c @@ -214,6 +214,7 @@ _initialize_ser_pipe (void) ops->send_break = ser_base_send_break; ops->go_raw = ser_base_raw; ops->get_tty_state = ser_base_get_tty_state; + ops->copy_tty_state = ser_base_copy_tty_state; ops->set_tty_state = ser_base_set_tty_state; ops->print_tty_state = ser_base_print_tty_state; ops->noflush_set_tty_state = ser_base_noflush_set_tty_state; diff --git a/gdb/ser-tcp.c b/gdb/ser-tcp.c index cbf31490008..e3d56405047 100644 --- a/gdb/ser-tcp.c +++ b/gdb/ser-tcp.c @@ -390,6 +390,7 @@ _initialize_ser_tcp (void) ops->send_break = ser_tcp_send_break; ops->go_raw = ser_base_raw; ops->get_tty_state = ser_base_get_tty_state; + ops->copy_tty_state = ser_base_copy_tty_state; ops->set_tty_state = ser_base_set_tty_state; ops->print_tty_state = ser_base_print_tty_state; ops->noflush_set_tty_state = ser_base_noflush_set_tty_state; diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index c213b3dbb61..da3a4c30b61 100644 --- a/gdb/ser-unix.c +++ b/gdb/ser-unix.c @@ -188,6 +188,17 @@ hardwire_get_tty_state (struct serial *scb) return (serial_ttystate) state; } +static serial_ttystate +hardwire_copy_tty_state (struct serial *scb, serial_ttystate ttystate) +{ + struct hardwire_ttystate *state; + + state = (struct hardwire_ttystate *) xmalloc (sizeof *state); + *state = *(struct hardwire_ttystate *) ttystate; + + return (serial_ttystate) state; +} + static int hardwire_set_tty_state (struct serial *scb, serial_ttystate ttystate) { @@ -911,6 +922,7 @@ _initialize_ser_hardwire (void) ops->send_break = hardwire_send_break; ops->go_raw = hardwire_raw; ops->get_tty_state = hardwire_get_tty_state; + ops->copy_tty_state = hardwire_copy_tty_state; ops->set_tty_state = hardwire_set_tty_state; ops->print_tty_state = hardwire_print_tty_state; ops->noflush_set_tty_state = hardwire_noflush_set_tty_state; diff --git a/gdb/serial.c b/gdb/serial.c index 954d22a20c8..7c8fbc2c76d 100644 --- a/gdb/serial.c +++ b/gdb/serial.c @@ -493,6 +493,12 @@ serial_get_tty_state (struct serial *scb) return scb->ops->get_tty_state (scb); } +serial_ttystate +serial_copy_tty_state (struct serial *scb, serial_ttystate ttystate) +{ + return scb->ops->copy_tty_state (scb, ttystate); +} + int serial_set_tty_state (struct serial *scb, serial_ttystate ttystate) { diff --git a/gdb/serial.h b/gdb/serial.h index 58207c7b196..a1eba8d3a6c 100644 --- a/gdb/serial.h +++ b/gdb/serial.h @@ -129,6 +129,12 @@ extern void serial_raw (struct serial *scb); extern serial_ttystate serial_get_tty_state (struct serial *scb); +/* Return a pointer to a newly malloc'd ttystate containing a copy + of the state in TTYSTATE. */ + +extern serial_ttystate serial_copy_tty_state (struct serial *scb, + serial_ttystate ttystate); + /* Set the state of the tty to TTYSTATE. The change is immediate. When changing to or from raw mode, input might be discarded. Returns 0 for success, negative value for error (in which case @@ -250,6 +256,7 @@ struct serial_ops int (*send_break) (struct serial *); void (*go_raw) (struct serial *); serial_ttystate (*get_tty_state) (struct serial *); + serial_ttystate (*copy_tty_state) (struct serial *, serial_ttystate); int (*set_tty_state) (struct serial *, serial_ttystate); void (*print_tty_state) (struct serial *, serial_ttystate, struct ui_file *);