1. 02 2月, 2013 5 次提交
    • R
      if pthread_create fails, it must not attempt mmap if there is no mapping · 077549e0
      Rich Felker 提交于
      this bug was introduced when support for application-provided stacks
      was originally added.
      077549e0
    • R
      pthread stack treatment overhaul for application-provided stacks, etc. · d5142642
      Rich Felker 提交于
      the main goal of these changes is to address the case where an
      application provides a stack of size N, but TLS has size M that's a
      significant portion of the size N (or even larger than N), thus giving
      the application less stack space than it expected or no stack at all!
      
      the new strategy pthread_create now uses is to only put TLS on the
      application-provided stack if TLS is smaller than 1/8 of the stack
      size or 2k, whichever is smaller. this ensures that the application
      always has "close enough" to what it requested, and the threshold is
      chosen heuristically to make sure "sane" amounts of TLS still end up
      in the application-provided stack.
      
      if TLS does not fit the above criteria, pthread_create uses mmap to
      obtain space for TLS, but still uses the application-provided stack
      for actual call frame stack. this is to avoid wasting memory, and for
      the sake of supporting ugly hacks like garbage collection based on
      assumptions that the implementation will use the provided stack range.
      
      in order for the above heuristics to ever succeed, the amount of TLS
      space wasted on POSIX TSD (pthread_key_create based) needed to be
      reduced. otherwise, these changes would preclude any use of
      pthread_create without mmap, which would have serious memory usage and
      performance costs for applications trying to create huge numbers of
      threads using pre-allocated stack space. the new value of
      PTHREAD_KEYS_MAX is the minimum allowed by POSIX, 128. this should
      still be plenty more than real-world applications need, especially now
      that C11/gcc-style TLS is now supported in musl, and most apps and
      libraries choose to use that instead of POSIX TSD when available.
      
      at the same time, PTHREAD_STACK_MIN has been decreased. it was
      originally set to PAGE_SIZE back when there was no support for TLS or
      application-provided stacks, and requests smaller than a whole page
      did not make sense. now, there are two good reasons to support
      requests smaller than a page: (1) applications could provide
      pre-allocated stacks smaller than a page, and (2) with smaller stack
      sizes, stack+TLS+TSD can all fit in one page, making it possible for
      applications which need huge numbers of threads with minimal stack
      needs to allocate exactly one page per thread. the new value of
      PTHREAD_STACK_MIN, 2k, is aligned with the minimum size for
      sigaltstack.
      d5142642
    • R
      make some arrays const · c5092507
      rofl0r 提交于
      this way they'll go into .rodata, decreasing memory pressure.
      c5092507
    • R
      replace __wake function with macro that performs direct syscall · facc6acb
      Rich Felker 提交于
      this should generate faster and smaller code, especially with inline
      syscalls. the conditional with cnt is ugly, but thankfully cnt is
      always a constant anyway so it gets evaluated at compile time. it may
      be preferable to make separate __wake and __wakeall macros without a
      count argument.
      
      priv flag is not used yet; private futex support still needs to be
      done at some point in the future.
      facc6acb
    • R
  2. 01 2月, 2013 2 次提交
  3. 31 1月, 2013 1 次提交
    • R
      SOL_TCP is nonstandard and not in the reserved namespace · 725c5552
      Rich Felker 提交于
      alternatively, we could define it in sys/socket.h since SO* is
      reserved there, and tcp.h includes sys/socket.h in extensions mode.
      
      note that SOL_TCP is simply wrong and it's only here for compatibility
      with broken applications. the correct argument to pass for setting TCP
      socket options is IPPROTO_TCP, which of course has the same value as
      SOL_TCP but works everywhere.
      725c5552
  4. 27 1月, 2013 1 次提交
  5. 24 1月, 2013 3 次提交
  6. 19 1月, 2013 1 次提交
    • R
      use a common definition of NULL as 0L for C and C++ · 41d7c77d
      Rich Felker 提交于
      the historical mess of having different definitions for C and C++
      comes from the historical C definition as (void *)0 and the fact that
      (void *)0 can't be used in C++ because it does not convert to other
      pointer types implicitly. however, using plain 0 in C++ exposed bugs
      in C++ programs that call variadic functions with NULL as an argument
      and (wrongly; this is UB) expect it to arrive as a null pointer. on
      64-bit machines, the high bits end up containing junk. glibc dodges
      the issue by using a GCC extension __null to define NULL; this is
      observably non-conforming because a conforming application could
      observe the definition of NULL via stringizing and see that it is
      neither an integer constant expression with value zero nor such an
      expression cast to void.
      
      switching to 0L eliminates the issue and provides compatibility with
      broken applications, since on all musl targets, long and pointers have
      the same size, representation, and argument-passing convention. we
      could maintain separate C and C++ definitions of NULL (i.e. just use
      0L on C++ and use (void *)0 on C) but after careful analysis, it seems
      extremely difficult for a C program to even determine whether NULL has
      integer or pointer type, much less depend in subtle, unintentional
      ways, on whether it does. C89 seems to have no way to make the
      distinction. on C99, the fact that (int)(void *)0 is not an integer
      constant expression, along with subtle VLA/sizeof semantics, can be
      used to make the distinction, but many compilers are non-conforming
      and give the wrong result to this test anyway. on C11, _Generic can
      trivially make the distinction, but it seems unlikely that code
      targetting C11 would be so backwards in caring which definition of
      NULL an implementation uses.
      
      as such, the simplest path of using the same definition for NULL in
      both C and C++ was chosen. the #undef directive was also removed so
      that the compiler can catch and give a warning or error on
      redefinition if buggy programs have defined their own versions of
      NULL prior to inclusion of standard headers.
      41d7c77d
  7. 17 1月, 2013 2 次提交
  8. 15 1月, 2013 2 次提交
  9. 14 1月, 2013 4 次提交
  10. 13 1月, 2013 13 次提交
  11. 11 1月, 2013 2 次提交
  12. 08 1月, 2013 1 次提交
    • S
      math: erf and erfc cleanup · 121e3a38
      Szabolcs Nagy 提交于
      common part of erf and erfc was put in a separate function which
      saved some space and the new code is using unsigned arithmetics
      
      erfcf had a bug: for some inputs in [7.95,8] the result had
      more than 60ulp error: in expf(-z*z - 0.5625f) the argument
      must be exact but not enough lowbits of z were zeroed,
      -SET_FLOAT_WORD(z, ix&0xfffff000);
      +SET_FLOAT_WORD(z, ix&0xffffe000);
      fixed the issue
      121e3a38
  13. 05 1月, 2013 3 次提交
    • R
      setjmp.h: add struct tag for sigjmp_buf (GCC C++ compatibility) · d84923d8
      rofl0r 提交于
      the anonymous struct typedef with array notation breaks with
      GCC in C++ mode:
      
      error: non-local function 'static<anonymous struct>
      (& boost::signal_handler::jump_buffer())[1]' uses anonymous type
      
      this is a known GCC issue, as search results for that error msg
      suggest.
      
      since this is hard to work around in the calling C++ code, a
      fix in musl is preferable.
      d84923d8
    • R
      add legacy header values.h · 2ba3f44d
      rofl0r 提交于
      some programs (procps, babl) expect it, and it doesn't seem to
      cause any harm to just add it.
      it's small and straightforward.
      
      since math.h also defines MAXFLOAT, we undef it in both places,
      before defining it.
      2ba3f44d
    • R
      87781ac6