1. 09 4月, 2011 1 次提交
    • R
      work around a nasty bug in linux readv syscall · 2cff36a8
      Rich Felker 提交于
      according to posix, readv "shall be equivalent to read(), except..."
      that it places the data into the buffers specified by the iov array.
      however on linux, when reading from a terminal, each iov element
      behaves almost like a separate read. this means that if the first iov
      exactly satisfied the request (e.g. a length-one read of '\n') and the
      second iov is nonzero length, the syscall will block again after
      getting the blank line from the terminal until another line is read.
      simply put, entering a single blank line becomes impossible.
      
      the solution, fortunately, is simple. whenever the buffer size is
      nonzero, reduce the length of the requested read by one byte and let
      the last byte go through the buffer. this way, readv will already be
      in the second (and last) iov, and won't re-block on the second iov.
      2cff36a8
  2. 28 3月, 2011 1 次提交
    • R
      major stdio overhaul, using readv/writev, plus other changes · e3cd6c5c
      Rich Felker 提交于
      the biggest change in this commit is that stdio now uses readv to fill
      the caller's buffer and the FILE buffer with a single syscall, and
      likewise writev to flush the FILE buffer and write out the caller's
      buffer in a single syscall.
      
      making this change required fundamental architectural changes to
      stdio, so i also made a number of other improvements in the process:
      
      - the implementation no longer assumes that further io will fail
        following errors, and no longer blocks io when the error flag is set
        (though the latter could easily be changed back if desired)
      
      - unbuffered mode is no longer implemented as a one-byte buffer. as a
        consequence, scanf unreading has to use ungetc, to the unget buffer
        has been enlarged to hold at least 2 wide characters.
      
      - the FILE structure has been rearranged to maintain the locations of
        the fields that might be used in glibc getc/putc type macros, while
        shrinking the structure to save some space.
      
      - error cases for fflush, fseek, etc. should be more correct.
      
      - library-internal macros are used for getc_unlocked and putc_unlocked
        now, eliminating some ugly code duplication. __uflow and __overflow
        are no longer used anywhere but these macros. switch to read or
        write mode is also separated so the code can be better shared, e.g.
        with ungetc.
      
      - lots of other small things.
      e3cd6c5c
  3. 20 3月, 2011 1 次提交
  4. 12 2月, 2011 1 次提交