1. 17 8月, 2020 1 次提交
  2. 03 11月, 2018 1 次提交
  3. 17 9月, 2018 1 次提交
    • R
      fix null pointer subtraction and comparison in stdio · 849e7603
      Rich Felker 提交于
      morally, for null pointers a and b, a-b, a<b, and a>b should all be
      defined as 0; however, C does not define any of them.
      
      the stdio implementation makes heavy use of such pointer comparison
      and subtraction for buffer logic, and also uses null pos/base/end
      pointers to indicate that the FILE is not in the corresponding (read
      or write) mode ready for accesses through the buffer.
      
      all of the comparisons are fixed trivially by using != in place of the
      relational operators, since the opposite relation (e.g. pos>end) is
      logically impossible. the subtractions have been reviewed to check
      that they are conditional the stream being in the appropriate reading-
      or writing-through-buffer mode, with checks added where needed.
      
      in fgets and getdelim, the checks added should improve performance for
      unbuffered streams by avoiding a do-nothing call to memchr, and should
      be negligible for buffered streams.
      849e7603
  4. 30 8月, 2017 1 次提交
  5. 19 9月, 2016 1 次提交
    • R
      simplify/refactor fflush and make fflush_unlocked an alias for fflush · c002668e
      Rich Felker 提交于
      previously, fflush_unlocked was an alias for an internal backend that
      was called by fflush, either for its argument or in a loop for each
      file if a null pointer was passed. since the logic for the latter was
      in the main fflush function, fflush_unlocked crashed when passed a
      null pointer, rather than flushing all open files. since
      fflush_unlocked is not a standard function and has no specification,
      it's not clear whether it should be expected to accept null pointers
      like fflush does, but a reasonable argument could be made that it
      should.
      
      this patch eliminates the helper function, simplifying fflush, and
      makes fflush_unlocked an alias for fflush, which is valid because the
      two functions agree in their behavior in all cases where their
      behavior is defined (the unlocked version has undefined behavior if
      another thread could hold locks).
      c002668e
  6. 16 6月, 2015 1 次提交
    • R
      refactor stdio open file list handling, move it out of global libc struct · 1b0cdc87
      Rich Felker 提交于
      functions which open in-memory FILE stream variants all shared a tail
      with __fdopen, adding the FILE structure to stdio's open file list.
      replacing this common tail with a function call reduces code size and
      duplication of logic. the list is also partially encapsulated now.
      
      function signatures were chosen to facilitate tail call optimization
      and reduce the need for additional accessor functions.
      
      with these changes, static linked programs that do not use stdio no
      longer have an open file list at all.
      1b0cdc87
  7. 17 7月, 2014 1 次提交
    • R
      work around constant folding bug 61144 in gcc 4.9.0 and 4.9.1 · a6adb2bc
      Rich Felker 提交于
      previously we detected this bug in configure and issued advice for a
      workaround, but this turned out not to work. since then gcc 4.9.0 has
      appeared in several distributions, and now 4.9.1 has been released
      without a fix despite this being a wrong code generation bug which is
      supposed to be a release-blocker, per gcc policy.
      
      since the scope of the bug seems to affect only data objects (rather
      than functions) whose definitions are overridable, and there are only
      a very small number of these in musl, I am just changing them from
      const to volatile for the time being. simply removing the const would
      be sufficient to make gcc 4.9.1 work (the non-const case was
      inadvertently fixed as part of another change in gcc), and this would
      also be sufficient with 4.9.0 if we forced -O0 on the affected files
      or on the whole build. however it's cleaner to just remove all the
      broken compiler detection and use volatile, which will ensure that
      they are never constant-folded. the quality of a non-broken compiler's
      output should not be affected except for the fact that these objects
      are no longer const and thus possibly add a few bytes to data/bss.
      
      this change can be reconsidered and possibly reverted at some point in
      the future when the broken gcc versions are no longer relevant.
      a6adb2bc
  8. 19 6月, 2012 2 次提交
  9. 30 7月, 2011 1 次提交
    • R
      add proper fuxed-based locking for stdio · dba68bf9
      Rich Felker 提交于
      previously, stdio used spinlocks, which would be unacceptable if we
      ever add support for thread priorities, and which yielded
      pathologically bad performance if an application attempted to use
      flockfile on a key file as a major/primary locking mechanism.
      
      i had held off on making this change for fear that it would hurt
      performance in the non-threaded case, but actually support for
      recursive locking had already inflicted that cost. by having the
      internal locking functions store a flag indicating whether they need
      to perform unlocking, rather than using the actual recursive lock
      counter, i was able to combine the conditionals at unlock time,
      eliminating any additional cost, and also avoid a nasty corner case
      where a huge number of calls to ftrylockfile could cause deadlock
      later at the point of internal locking.
      
      this commit also fixes some issues with usage of pthread_self
      conflicting with __attribute__((const)) which resulted in crashes with
      some compiler versions/optimizations, mainly in flockfile prior to
      pthread_create.
      dba68bf9
  10. 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
  11. 12 2月, 2011 1 次提交