PR 15068
authorFred Fish <fnf@specifix.com>
Fri, 6 Mar 1998 20:38:45 +0000 (20:38 +0000)
committerFred Fish <fnf@specifix.com>
Fri, 6 Mar 1998 20:38:45 +0000 (20:38 +0000)
* utils.c (quit): Call SERIAL_DRAIN_OUTPUT rather than
  SERIAL_FLUSH_OUTPUT.
* serial.h (struct serial_ops): Add drain_output, pointer to
  function that waits for output to drain.
(SERIAL_DRAIN_OUTPUT): Macro to wait for output to drain.
* ser-unix.c (hardwire_drain_output): New function and prototype.

* ser-unix.c (hardwire_ops): Add entry for drain_output function.
* ser-tcp.c (tcp_ops): Ditto.
* ser-ocd.c (ocd_ops): Ditto.
* ser-mac.c (mac_ops): Ditto.
* ser-go32.c (dos_ops): Ditto.
* ser-e7kpc.c (e7000pc_ops): Ditto.

gdb/ChangeLog
gdb/ser-e7kpc.c
gdb/ser-go32.c
gdb/ser-mac.c
gdb/ser-ocd.c
gdb/ser-tcp.c
gdb/ser-unix.c
gdb/serial.h

index b356ec5f523c9f1548d5d13b77bddc60270eabff..59eb4ddfc914e3e798e12c3f7f9a303ef95b5ddf 100644 (file)
@@ -1,3 +1,19 @@
+Fri Mar  6 13:10:27 1998  Fred Fish  <fnf@cygnus.com>
+
+       * utils.c (quit): Call SERIAL_DRAIN_OUTPUT rather than
+       SERIAL_FLUSH_OUTPUT.
+       * serial.h (struct serial_ops): Add drain_output, pointer to
+       function that waits for output to drain.
+       (SERIAL_DRAIN_OUTPUT): Macro to wait for output to drain.
+       * ser-unix.c (hardwire_drain_output): New function and prototype.
+
+       * ser-unix.c (hardwire_ops): Add entry for drain_output function.
+       * ser-tcp.c (tcp_ops): Ditto.
+       * ser-ocd.c (ocd_ops): Ditto.
+       * ser-mac.c (mac_ops): Ditto.
+       * ser-go32.c (dos_ops): Ditto.
+       * ser-e7kpc.c (e7000pc_ops): Ditto.
+
 Thu Mar  5 16:07:41 1998  Michael Snyder  (msnyder@cleaver.cygnus.com)
 
        * sparcl-tdep.c: fix #endif comments
index 8cf6ec68a033a0d7e82fafcade6b01185fa85741..4997ba275b0e9c6f7a73e0c1ed272440b8d05feb 100644 (file)
@@ -453,6 +453,7 @@ static struct serial_ops e7000pc_ops =
   e7000pc_print_tty_state,
   e7000pc_noflush_set_tty_state,
   e7000pc_setbaudrate,
+  e7000pc_noop,                        /* wait for output to drain */
 };
 
 void
index 4af25f14019dc9e8225ac93872c49856165911e1..f776161964aac50c4d630107ad0885db7ee9ed99 100644 (file)
@@ -848,6 +848,7 @@ static struct serial_ops dos_ops =
   dos_noflush_set_tty_state,
   dos_setbaudrate,
   dos_setstopbits,
+  dos_noop,                    /* wait for output to drain */
 };
 
 
index 35400029b028fefd1e7728015011b397246f4573..df0040edbf20aa23d0f79c61167eba97aa18f87a 100644 (file)
@@ -352,6 +352,7 @@ static struct serial_ops mac_ops =
   mac_noflush_set_tty_state,
   mac_set_baud_rate,
   mac_set_stop_bits,
+  mac_noop,                    /* wait for output to drain */
 };
 
 void
index 08239bba3a4e6f66970c5c9ccd264bc560c427d9..7ef17967c4d8e5d01b1b86ad3a5d150b68d4d200 100644 (file)
@@ -197,6 +197,7 @@ static struct serial_ops ocd_ops =
   ocd_print_tty_state,
   ocd_noflush_set_tty_state,
   ocd_setbaudrate,
+  ocd_noop,            /* wait for output to drain */
 };
 
 void
index 23153a9d0dec8591da7d1538d60f1a49c4cdf2bd..279cbd0d718a6422e059eb94babb923c1a223eb1 100644 (file)
@@ -342,6 +342,7 @@ static struct serial_ops tcp_ops =
   tcp_noflush_set_tty_state,
   tcp_setbaudrate,
   tcp_setstopbits,
+  tcp_return_0,        /* wait for output to drain */
 };
 
 void
index a77da5921004f69a124eb7c8979242c58f7c1ce5..b1ffca0fea87a826853434b90bd63d229c2e0449 100644 (file)
@@ -77,6 +77,7 @@ static int hardwire_set_tty_state PARAMS ((serial_t scb, serial_ttystate state))
 static int hardwire_noflush_set_tty_state PARAMS ((serial_t, serial_ttystate,
                                                   serial_ttystate));
 static void hardwire_print_tty_state PARAMS ((serial_t, serial_ttystate));
+static int hardwire_drain_output PARAMS ((serial_t));
 static int hardwire_flush_output PARAMS ((serial_t));
 static int hardwire_flush_input PARAMS ((serial_t));
 static int hardwire_send_break PARAMS ((serial_t));
@@ -275,6 +276,38 @@ hardwire_print_tty_state (scb, ttystate)
 #endif
 }
 
+/* Wait for the output to drain away, as opposed to flushing (discarding) it */
+
+static int
+hardwire_drain_output (scb)
+     serial_t scb;
+{
+#ifdef HAVE_TERMIOS
+  return tcdrain (scb->fd);
+#endif
+
+#ifdef HAVE_TERMIO
+  return ioctl (scb->fd, TCSBRK, 1);
+#endif
+
+#ifdef HAVE_SGTTY
+  /* Get the current state and then restore it using TIOCSETP,
+     which should cause the output to drain and pending input
+     to be discarded. */
+  {
+    struct hardwire_ttystate state;
+    if (get_tty_state (scb, &state))
+      {
+       return (-1);
+      }
+    else
+      {
+       return (ioctl (scb->fd, TIOCSETP, &state.sgttyb));
+      }
+  }
+#endif  
+}
+
 static int
 hardwire_flush_output (scb)
      serial_t scb;
@@ -727,6 +760,7 @@ static struct serial_ops hardwire_ops =
   hardwire_noflush_set_tty_state,
   hardwire_setbaudrate,
   hardwire_setstopbits,
+  hardwire_drain_output,       /* wait for output to drain */
 };
 
 void
index f1963d0961858c74bffd61c00aa9332499aa910e..04332bcb11fc9c5cad42e5d86945b64bf76f75c8 100644 (file)
@@ -50,7 +50,9 @@ struct serial_ops {
   void (*close) PARAMS ((serial_t));
   int (*readchar) PARAMS ((serial_t, int timeout));
   int (*write) PARAMS ((serial_t, const char *str, int len));
+  /* Discard pending output */
   int (*flush_output) PARAMS ((serial_t));
+  /* Discard pending input */
   int (*flush_input) PARAMS ((serial_t));
   int (*send_break) PARAMS ((serial_t));
   void (*go_raw) PARAMS ((serial_t));
@@ -61,6 +63,8 @@ struct serial_ops {
     PARAMS ((serial_t, serial_ttystate, serial_ttystate));
   int (*setbaudrate) PARAMS ((serial_t, int rate));
   int (*setstopbits) PARAMS ((serial_t, int num));
+  /* Wait for output to drain */
+  int (*drain_output) PARAMS ((serial_t));
 };
 
 /* Add a new serial interface to the interface list */
@@ -83,7 +87,12 @@ serial_t serial_fdopen PARAMS ((const int fd));
 
 #define SERIAL_FDOPEN(FD) serial_fdopen(FD)
 
-/* Flush pending output.  Might also flush input (if this system can't flush
+/* Allow pending output to drain. */
+
+#define SERIAL_DRAIN_OUTPUT(SERIAL_T) \
+  ((SERIAL_T)->ops->drain_output((SERIAL_T)))
+  
+/* Flush (discard) pending output.  Might also flush input (if this system can't flush
    only output).  */
 
 #define SERIAL_FLUSH_OUTPUT(SERIAL_T) \