From 864df7e6f35f352b139061a7d0546c002067e507 Mon Sep 17 00:00:00 2001 From: Jim Kingdon Date: Sat, 22 Jan 1994 19:16:02 +0000 Subject: [PATCH] * remote-mips.c (mips_initialize): Clear mips_initializing via cleanup chain, not directly. * ser-unix.c (wait_for) [HAVE_TERMIO, HAVE_TERMIOS]: Make a timeout of -1 mean forever, like in the HAVE_SGTTY case. Warn if we are munging the timeout due to the limited range of c_cc[VTIME]. --- gdb/ChangeLog | 7 +++++++ gdb/remote-mips.c | 18 ++++++++++++++++-- gdb/ser-unix.c | 34 ++++++++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index da5fe2e2406..b9de4b19ffd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ Sat Jan 22 08:30:42 1994 Jim Kingdon (kingdon@deneb.cygnus.com) + * remote-mips.c (mips_initialize): Clear mips_initializing via + cleanup chain, not directly. + + * ser-unix.c (wait_for) [HAVE_TERMIO, HAVE_TERMIOS]: Make a timeout + of -1 mean forever, like in the HAVE_SGTTY case. Warn if we are + munging the timeout due to the limited range of c_cc[VTIME]. + * fork-child.c, inferior.h (fork_inferior): New argument shell_file. * procfs.c (procfs_create_inferior), inftarg.c (child_create_inferior), m3-nat.c (m3_create_inferior): Pass it. diff --git a/gdb/remote-mips.c b/gdb/remote-mips.c index 02310b3b872..23e89f4a8cf 100644 --- a/gdb/remote-mips.c +++ b/gdb/remote-mips.c @@ -888,6 +888,13 @@ mips_request (cmd, addr, data, perr, timeout) return rresponse; } +static void +mips_initialize_cleanups (arg) + PTR arg; +{ + mips_initializing = 0; +} + /* Initialize a new connection to the MIPS board, and make sure we are really connected. */ @@ -897,9 +904,16 @@ mips_initialize () char cr; char buff[DATA_MAXLEN + 1]; int err; + struct cleanup *old_cleanups = make_cleanup (mips_initialize_cleanups, NULL); + /* What is this code doing here? I don't see any way it can happen, and + it might mean mips_initializing didn't get cleared properly. + So I'll make it a warning. */ if (mips_initializing) - return; + { + warning ("internal error: mips_initialize called twice"); + return; + } mips_initializing = 1; @@ -929,7 +943,7 @@ mips_initialize () } mips_receive_packet (buff, 1, 3); - mips_initializing = 0; + do_cleanups (old_cleanups); /* If this doesn't call error, we have connected; we don't care if the request itself succeeds or fails. */ diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index d14a996ed55..0e490fb377f 100644 --- a/gdb/ser-unix.c +++ b/gdb/ser-unix.c @@ -435,11 +435,41 @@ wait_for(scb, timeout) fprintf_unfiltered(gdb_stderr, "get_tty_state failed: %s\n", safe_strerror(errno)); #ifdef HAVE_TERMIOS - state.termios.c_cc[VTIME] = timeout * 10; + if (timeout < 0) + { + /* No timeout. */ + state.termios.c_cc[VTIME] = 0; + state.termios.c_cc[VMIN] = 1; + } + else + { + state.termios.c_cc[VMIN] = 0; + state.termios.c_cc[VTIME] = timeout * 10; + if (state.termios.c_cc[VTIME] != timeout * 10) + { + warning ("Timeout value %d too large, using %d", timeout, + state.termios.c_cc[VTIME] / 10); + } + } #endif #ifdef HAVE_TERMIO - state.termio.c_cc[VTIME] = timeout * 10; + if (timeout < 0) + { + /* No timeout. */ + state.termio.c_cc[VTIME] = 0; + state.termio.c_cc[VMIN] = 1; + } + else + { + state.termio.c_cc[VMIN] = 0; + state.termio.c_cc[VTIME] = timeout * 10; + if (state.termio.c_cc[VTIME] != timeout * 10) + { + warning ("Timeout value %d too large, using %d", timeout, + state.termio.c_cc[VTIME] / 10); + } + } #endif scb->current_timeout = timeout; -- 2.30.2