Changeset c0af4e47 in rtems


Ignore:
Timestamp:
Aug 16, 2001, 8:58:14 PM (20 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
b8575ab
Parents:
b9ff276c
Message:

2001-08-16 Mike Siers <mikes@…>

  • libc/termios.c: Fix a bug in the termios implementation in the following scenario: The General Terminal Interface document that me states that if VMIN = 0 and VTIME = 0, then read() should return the minimum of two values:

a) number of bytes available
b) number of bytes requested (I assume from the read call)

The current implementation of the fillBufferQueue() in termios.c is
always return 1 character with these setting values. I know the
termios buffer has more than one character available and my read()
call is requesting 1024 bytes.

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/libcsupport/src/termios.c

    rb9ff276c rc0af4e47  
    191191                        return RTEMS_NO_MEMORY;
    192192                }
     193                /*
     194                 * Initialize wakeup callbacks
     195                 */
     196                tty->tty_snd.sw_pfn = NULL;
     197                tty->tty_snd.sw_arg = NULL;
     198                tty->tty_rcv.sw_pfn = NULL;
     199                tty->tty_rcv.sw_arg = NULL;
     200                tty->tty_rcvwakeup  = 0;
    193201                /*
    194202                 * link tty
     
    498506        rtems_libio_ioctl_args_t *args = arg;
    499507        struct rtems_termios_tty *tty = args->iop->data1;
     508        struct ttywakeup         *wakeup = (struct ttywakeup *)args->buffer;
    500509        rtems_status_code sc;
    501510
     
    560569        case RTEMS_IO_TCDRAIN:
    561570                drainOutput (tty);
     571                break;
     572
     573        case RTEMS_IO_SNDWAKEUP:
     574                tty->tty_snd = *wakeup;
     575                break;
     576
     577        case RTEMS_IO_RCVWAKEUP:
     578                tty->tty_rcv = *wakeup;
    562579                break;
    563580
     
    10601077        if (linesw[tty->t_line].l_read != NULL) {
    10611078                sc = linesw[tty->t_line].l_read(tty,args);
     1079                tty->tty_rcvwakeup = 0;
    10621080                rtems_semaphore_release (tty->isem);
    10631081                return sc;
     
    10791097        }
    10801098        args->bytes_moved = args->count - count;
     1099        tty->tty_rcvwakeup = 0;
    10811100        rtems_semaphore_release (tty->isem);
    10821101        return sc;
     
    11171136            linesw[tty->t_line].l_rint(c,tty);
    11181137          }
     1138           
     1139          /*
     1140           * check to see if rcv wakeup callback was set
     1141           */
     1142          if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
     1143            (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
     1144            tty->tty_rcvwakeup = 1;
     1145          }
    11191146          return 0;
    11201147        }
     
    12021229                        tty->rawInBuf.theBuf[newTail] = c;
    12031230                        tty->rawInBuf.Tail = newTail;
     1231           
     1232                        /*
     1233                         * check to see if rcv wakeup callback was set
     1234                         */
     1235                        if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
     1236                          (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
     1237                          tty->tty_rcvwakeup = 1;
     1238                        }
    12041239                }               
    12051240          }
     
    12891324            tty->rawOutBufState = rob_idle;
    12901325            nToSend = 0;
     1326           
     1327            /*
     1328             * check to see if snd wakeup callback was set
     1329             */
     1330            if ( tty->tty_snd.sw_pfn != NULL) {
     1331              (*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
     1332            }
    12911333          }
    12921334          /* check, whether output should stop due to received XOFF */
  • c/src/lib/libc/termios.c

    rb9ff276c rc0af4e47  
    191191                        return RTEMS_NO_MEMORY;
    192192                }
     193                /*
     194                 * Initialize wakeup callbacks
     195                 */
     196                tty->tty_snd.sw_pfn = NULL;
     197                tty->tty_snd.sw_arg = NULL;
     198                tty->tty_rcv.sw_pfn = NULL;
     199                tty->tty_rcv.sw_arg = NULL;
     200                tty->tty_rcvwakeup  = 0;
    193201                /*
    194202                 * link tty
     
    498506        rtems_libio_ioctl_args_t *args = arg;
    499507        struct rtems_termios_tty *tty = args->iop->data1;
     508        struct ttywakeup         *wakeup = (struct ttywakeup *)args->buffer;
    500509        rtems_status_code sc;
    501510
     
    560569        case RTEMS_IO_TCDRAIN:
    561570                drainOutput (tty);
     571                break;
     572
     573        case RTEMS_IO_SNDWAKEUP:
     574                tty->tty_snd = *wakeup;
     575                break;
     576
     577        case RTEMS_IO_RCVWAKEUP:
     578                tty->tty_rcv = *wakeup;
    562579                break;
    563580
     
    10601077        if (linesw[tty->t_line].l_read != NULL) {
    10611078                sc = linesw[tty->t_line].l_read(tty,args);
     1079                tty->tty_rcvwakeup = 0;
    10621080                rtems_semaphore_release (tty->isem);
    10631081                return sc;
     
    10791097        }
    10801098        args->bytes_moved = args->count - count;
     1099        tty->tty_rcvwakeup = 0;
    10811100        rtems_semaphore_release (tty->isem);
    10821101        return sc;
     
    11171136            linesw[tty->t_line].l_rint(c,tty);
    11181137          }
     1138           
     1139          /*
     1140           * check to see if rcv wakeup callback was set
     1141           */
     1142          if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
     1143            (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
     1144            tty->tty_rcvwakeup = 1;
     1145          }
    11191146          return 0;
    11201147        }
     
    12021229                        tty->rawInBuf.theBuf[newTail] = c;
    12031230                        tty->rawInBuf.Tail = newTail;
     1231           
     1232                        /*
     1233                         * check to see if rcv wakeup callback was set
     1234                         */
     1235                        if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
     1236                          (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
     1237                          tty->tty_rcvwakeup = 1;
     1238                        }
    12041239                }               
    12051240          }
     
    12891324            tty->rawOutBufState = rob_idle;
    12901325            nToSend = 0;
     1326           
     1327            /*
     1328             * check to see if snd wakeup callback was set
     1329             */
     1330            if ( tty->tty_snd.sw_pfn != NULL) {
     1331              (*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
     1332            }
    12911333          }
    12921334          /* check, whether output should stop due to received XOFF */
  • cpukit/libcsupport/src/termios.c

    rb9ff276c rc0af4e47  
    191191                        return RTEMS_NO_MEMORY;
    192192                }
     193                /*
     194                 * Initialize wakeup callbacks
     195                 */
     196                tty->tty_snd.sw_pfn = NULL;
     197                tty->tty_snd.sw_arg = NULL;
     198                tty->tty_rcv.sw_pfn = NULL;
     199                tty->tty_rcv.sw_arg = NULL;
     200                tty->tty_rcvwakeup  = 0;
    193201                /*
    194202                 * link tty
     
    498506        rtems_libio_ioctl_args_t *args = arg;
    499507        struct rtems_termios_tty *tty = args->iop->data1;
     508        struct ttywakeup         *wakeup = (struct ttywakeup *)args->buffer;
    500509        rtems_status_code sc;
    501510
     
    560569        case RTEMS_IO_TCDRAIN:
    561570                drainOutput (tty);
     571                break;
     572
     573        case RTEMS_IO_SNDWAKEUP:
     574                tty->tty_snd = *wakeup;
     575                break;
     576
     577        case RTEMS_IO_RCVWAKEUP:
     578                tty->tty_rcv = *wakeup;
    562579                break;
    563580
     
    10601077        if (linesw[tty->t_line].l_read != NULL) {
    10611078                sc = linesw[tty->t_line].l_read(tty,args);
     1079                tty->tty_rcvwakeup = 0;
    10621080                rtems_semaphore_release (tty->isem);
    10631081                return sc;
     
    10791097        }
    10801098        args->bytes_moved = args->count - count;
     1099        tty->tty_rcvwakeup = 0;
    10811100        rtems_semaphore_release (tty->isem);
    10821101        return sc;
     
    11171136            linesw[tty->t_line].l_rint(c,tty);
    11181137          }
     1138           
     1139          /*
     1140           * check to see if rcv wakeup callback was set
     1141           */
     1142          if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
     1143            (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
     1144            tty->tty_rcvwakeup = 1;
     1145          }
    11191146          return 0;
    11201147        }
     
    12021229                        tty->rawInBuf.theBuf[newTail] = c;
    12031230                        tty->rawInBuf.Tail = newTail;
     1231           
     1232                        /*
     1233                         * check to see if rcv wakeup callback was set
     1234                         */
     1235                        if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
     1236                          (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
     1237                          tty->tty_rcvwakeup = 1;
     1238                        }
    12041239                }               
    12051240          }
     
    12891324            tty->rawOutBufState = rob_idle;
    12901325            nToSend = 0;
     1326           
     1327            /*
     1328             * check to see if snd wakeup callback was set
     1329             */
     1330            if ( tty->tty_snd.sw_pfn != NULL) {
     1331              (*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
     1332            }
    12911333          }
    12921334          /* check, whether output should stop due to received XOFF */
Note: See TracChangeset for help on using the changeset viewer.