1. 02 2月, 2013 1 次提交
    • 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
  2. 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
  3. 24 1月, 2013 2 次提交
    • R
      add RTLD_NODELETE flag for dlopen · 55ddbc3e
      Rich Felker 提交于
      this is a trivial no-op, because dlclose never deletes libraries. thus
      we might as well have it in the header in case some application wants
      it, since we're already providing it anyway.
      55ddbc3e
    • R
      add support for RTLD_NOLOAD to dlopen · 4d07e552
      Rich Felker 提交于
      based on patch by Pierre Carrier <pierre@gcarrier.fr> that just added
      the flag constant, but with minimal additional code so that it
      actually works as documented. this is a nonstandard option but some
      major software (reportedly, Firefox) uses it and it was easy to add
      anyway.
      4d07e552
  4. 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
  5. 13 1月, 2013 9 次提交
  6. 11 1月, 2013 1 次提交
  7. 05 1月, 2013 5 次提交
    • 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
    • R
      wait.h: add linux specific, thread-related waitpid() flags · e895ddc0
      rofl0r 提交于
      these flags are needed in order to be able to handle lwp id's
      which the kernel returns after clone() calls for new threads
      via ptrace(PTRACE_GETEVENTMSG).
      
      fortunately, they're the same for all archs and in the reserved
      namespace.
      e895ddc0
    • R
      __assert_fail(): remove _Noreturn, to get proper stacktraces · 2c1f8fd5
      rofl0r 提交于
      for _Noreturn functions, gcc generates code that trashes the
      stack frame, and so it makes it impossible to inspect the causes
      of an assert error in gdb.
      
      abort() is not affected (i have not yet investigated why).
      2c1f8fd5
  8. 02 1月, 2013 1 次提交
  9. 29 12月, 2012 1 次提交
  10. 28 12月, 2012 1 次提交
    • R
      align EPOLL_* flags with fcntl O_* flag definitions, which vary by arch · 761ebe06
      Rich Felker 提交于
      the old definitions were wrong on some archs. actually, EPOLL_NONBLOCK
      probably should not even be defined; it is not accepted by the kernel
      and it's not clear to me whether it has any use at all, even if it did
      work. this issue should be revisited at some point, but I'm leaving it
      in place for now in case some applications reference it.
      761ebe06
  11. 27 12月, 2012 1 次提交
  12. 20 12月, 2012 1 次提交
  13. 19 12月, 2012 4 次提交
    • S
      math: more correct tgmath.h type cast logic · 3c4214db
      Szabolcs Nagy 提交于
      __IS_FP is a portable integer constant expression now
      (uses that unsigned long long is larger than float)
      the result casting logic should work now on all compilers
      supporting typeof
      3c4214db
    • R
      add inet_network (required for wine) · 36d73038
      rofl0r 提交于
      36d73038
    • R
      link.h: expose glibc/svr4 dynlinker debugging glue · 26cf9c3c
      rofl0r 提交于
      this is already implemented in the dynliker (see struct debug),
      but was not exposed.
      we need it to do so to make wine happy...
      26cf9c3c
    • S
      math: new type cast logic in tgmath.h · e9e2b66e
      Szabolcs Nagy 提交于
      * return type logic is simplified a bit and fixed (see below)
      * return type of conj and cproj were wrong on int arguments
      * added comments about the pending issues
      (usually we don't have comments in public headers but this is
      not the biggest issue with tgmath.h)
      
      casting the result to the right type cannot be done in c99
      (c11 _Generic can solve this but that is not widely supported),
      so the typeof extension of gcc is used and that the ?: operator
      has special semantics when one of the operands is a null
      pointer constant
      
      the standard is very strict about the definition of null
      pointer constants so typeof with ?: is still not enough so
      compiler specific workaround is used for now
      
      on gcc '!1.0' is a null pointer constant so we can use the old
      __IS_FP logic (eventhough it's non-standard)
      
      on clang (and on gcc as well) 'sizeof(void)-1' is a null
      pointer constant so we can use
       !(sizeof(*(0?(int*)0:(void*)__IS_FP(x)))-1)
      (this is non-standard as well), the old logic is used by
      default and this new one on clang
      e9e2b66e
  14. 15 12月, 2012 1 次提交
  15. 14 12月, 2012 2 次提交
  16. 12 12月, 2012 2 次提交
  17. 11 12月, 2012 2 次提交
    • R
      fix regressions in app compatibility from previous sys/ipc.h changes · 490d4a0e
      Rich Felker 提交于
      despite glibc using __key and __seq rather than key and seq, some
      applications, notably busybox, assume the names are key and seq unless
      glibc is being used. and the names key and seq are really the ones
      that _should_ be exposed when not attempting to present a
      standards-conforming namespace; apps should not be using names that
      begin with double-underscore. thus, the optimal fix is to use key and
      seq as the actual names of the members when in bsd/gnu source profile,
      and define macros for __key and __seq that redirect to plain key and
      seq.
      490d4a0e
    • R
      syscall() declaration belongs in unistd.h, not sys/syscall.h · baf246e5
      Rich Felker 提交于
      traditionally, both BSD and GNU systems have it this way.
      sys/syscall.h is purely syscall number macros. presently glibc exposes
      the syscall declaration in unistd.h only with _GNU_SOURCE, but that
      does not reflect historical practice.
      baf246e5
  18. 07 12月, 2012 4 次提交
    • R
      fix names of ipc_perm __key/__seq elements · d1b6fc6e
      Rich Felker 提交于
      previously the names were exposed as key/seq with _GNU_SOURCE and
      __ipc_perm_key/__ipc_perm/seq otherwise, whereas glibc always uses
      __key and __seq for the names. thus, the old behavior never matched
      glibc, and the new behavior always does, regardless of feature test
      macros.
      
      for now, i'm leaving the renaming here in sys/ipc.h where it's easy to
      change globally for all archs, in case something turns out to be
      wrong, but eventually the names could just be incorporated directly
      into the bits headers for each arch and the renaming removed.
      d1b6fc6e
    • R
      fix F_DUPFD_CLOEXEC being defined twice · e00e07f6
      rofl0r 提交于
      e00e07f6
    • R
      fixup for fcntl.h changes · e34d967c
      rofl0r 提交于
      e34d967c
    • R
      add personality syscall · 6fb88a95
      rofl0r 提交于
      6fb88a95