aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/remote-mips.c18
-rw-r--r--gdb/ser-unix.c34
3 files changed, 55 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index da5fe2e..b9de4b1 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 02310b3..23e89f4 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 d14a996..0e490fb 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;