Changeset 4b3c197f in rtems


Ignore:
Timestamp:
Aug 16, 2001, 8:04:19 PM (19 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
2f1b930
Parents:
2fe224f
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:
4 edited

Legend:

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

    r2fe224f r4b3c197f  
    983983        rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout;
    984984        rtems_status_code sc;
    985 
    986         for (;;) {
     985        int               wait = (int)1;
     986
     987        while ( wait ) {
    987988                /*
    988989                 * Process characters read from raw queue
     
    10211022                        if (tty->termios.c_lflag & ICANON) {
    10221023                                if  (siproc (c, tty))
    1023                                         return RTEMS_SUCCESSFUL;
     1024                                        wait = 0;
    10241025                        }
    10251026                        else {
    10261027                                siproc (c, tty);
    10271028                                if (tty->ccount >= tty->termios.c_cc[VMIN])
    1028                                         return RTEMS_SUCCESSFUL;
     1029                                        wait = 0;
    10291030                        }
    10301031                        timeout = tty->rawInBufSemaphoreTimeout;
     
    10341035                 * Wait for characters
    10351036                 */
    1036                 sc = rtems_semaphore_obtain (tty->rawInBuf.Semaphore,
    1037                                                 tty->rawInBufSemaphoreOptions,
    1038                                                 timeout);
    1039                 if (sc != RTEMS_SUCCESSFUL)
    1040                         break;
     1037                if ( wait ) {
     1038                        sc = rtems_semaphore_obtain (tty->rawInBuf.Semaphore,
     1039                                tty->rawInBufSemaphoreOptions,
     1040                                timeout);
     1041                        if (sc != RTEMS_SUCCESSFUL)
     1042                                break;
     1043                }
    10411044        }
    10421045        return RTEMS_SUCCESSFUL;
  • c/src/lib/ChangeLog

    r2fe224f r4b3c197f  
     12001-08-16      Mike Siers <mikes@poliac.com>
     2
     3        * libc/termios.c: Fix a bug in the termios implementation in
     4        the following scenario:
     5          The General Terminal Interface document that me states that
     6          if VMIN = 0 and VTIME = 0, then read() should return the minimum
     7          of two values:
     8                a) number of bytes available
     9                b) number of bytes requested (I assume from the read call)
     10
     11          The current implementation of the fillBufferQueue() in termios.c is
     12          always return 1 character with these setting values.  I know the
     13          termios buffer has more than one character available and my read()
     14          call is requesting 1024 bytes.
     15
    1162001-08-09      Fernando-Ruiz Casas <correo@fernando-ruiz.com>
    217
  • c/src/lib/libc/termios.c

    r2fe224f r4b3c197f  
    983983        rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout;
    984984        rtems_status_code sc;
    985 
    986         for (;;) {
     985        int               wait = (int)1;
     986
     987        while ( wait ) {
    987988                /*
    988989                 * Process characters read from raw queue
     
    10211022                        if (tty->termios.c_lflag & ICANON) {
    10221023                                if  (siproc (c, tty))
    1023                                         return RTEMS_SUCCESSFUL;
     1024                                        wait = 0;
    10241025                        }
    10251026                        else {
    10261027                                siproc (c, tty);
    10271028                                if (tty->ccount >= tty->termios.c_cc[VMIN])
    1028                                         return RTEMS_SUCCESSFUL;
     1029                                        wait = 0;
    10291030                        }
    10301031                        timeout = tty->rawInBufSemaphoreTimeout;
     
    10341035                 * Wait for characters
    10351036                 */
    1036                 sc = rtems_semaphore_obtain (tty->rawInBuf.Semaphore,
    1037                                                 tty->rawInBufSemaphoreOptions,
    1038                                                 timeout);
    1039                 if (sc != RTEMS_SUCCESSFUL)
    1040                         break;
     1037                if ( wait ) {
     1038                        sc = rtems_semaphore_obtain (tty->rawInBuf.Semaphore,
     1039                                tty->rawInBufSemaphoreOptions,
     1040                                timeout);
     1041                        if (sc != RTEMS_SUCCESSFUL)
     1042                                break;
     1043                }
    10411044        }
    10421045        return RTEMS_SUCCESSFUL;
  • cpukit/libcsupport/src/termios.c

    r2fe224f r4b3c197f  
    983983        rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout;
    984984        rtems_status_code sc;
    985 
    986         for (;;) {
     985        int               wait = (int)1;
     986
     987        while ( wait ) {
    987988                /*
    988989                 * Process characters read from raw queue
     
    10211022                        if (tty->termios.c_lflag & ICANON) {
    10221023                                if  (siproc (c, tty))
    1023                                         return RTEMS_SUCCESSFUL;
     1024                                        wait = 0;
    10241025                        }
    10251026                        else {
    10261027                                siproc (c, tty);
    10271028                                if (tty->ccount >= tty->termios.c_cc[VMIN])
    1028                                         return RTEMS_SUCCESSFUL;
     1029                                        wait = 0;
    10291030                        }
    10301031                        timeout = tty->rawInBufSemaphoreTimeout;
     
    10341035                 * Wait for characters
    10351036                 */
    1036                 sc = rtems_semaphore_obtain (tty->rawInBuf.Semaphore,
    1037                                                 tty->rawInBufSemaphoreOptions,
    1038                                                 timeout);
    1039                 if (sc != RTEMS_SUCCESSFUL)
    1040                         break;
     1037                if ( wait ) {
     1038                        sc = rtems_semaphore_obtain (tty->rawInBuf.Semaphore,
     1039                                tty->rawInBufSemaphoreOptions,
     1040                                timeout);
     1041                        if (sc != RTEMS_SUCCESSFUL)
     1042                                break;
     1043                }
    10411044        }
    10421045        return RTEMS_SUCCESSFUL;
Note: See TracChangeset for help on using the changeset viewer.