1. 04 2月, 2013 3 次提交
    • R
      fix unsigned comparison bug in posix_spawn · 4862864f
      Rich Felker 提交于
      read should never return anything but 0 or sizeof ec here, but if it
      does, we want to treat any other return as "success". then the caller
      will get back the pid and is responsible for waiting on it when it
      immediately exits.
      4862864f
    • R
      overhaul posix_spawn to use CLONE_VM instead of vfork · fb6b159d
      Rich Felker 提交于
      the proposed change was described in detail in detail previously on
      the mailing list. in short, vfork is unsafe because:
      
      1. the compiler could make optimizations that cause the child to
      clobber the parent's local vars.
      
      2. strace is buggy and allows the vforking parent to run before the
      child execs when run under strace.
      
      the new design uses a close-on-exec pipe instead of vfork semantics to
      synchronize the parent and child so that the parent does not return
      before the child has finished using its arguments (and now, also its
      stack). this also allows reporting exec failures to the caller instead
      of giving the caller a child that mysteriously exits with status 127
      on exec error.
      
      basic testing has been performed on both the success and failure code
      paths. further testing should be done.
      fb6b159d
    • R
      streamline old-kernel fallback path of pipe2 to use syscalls directly · 89d3df6e
      Rich Felker 提交于
      also, don't waste code/time on F_GETFL since pipes always have blank
      flags initially (at least on old kernels, which are all this fallback
      code matters for).
      89d3df6e
  2. 03 2月, 2013 1 次提交
  3. 02 2月, 2013 11 次提交
    • R
      dynamically allocate storage for gethostby* buffers · a47ad3eb
      Rich Felker 提交于
      this change shaves ~1k off libc.so bss size, and also avoids hard
      errors in the case where the static buffer was not large enough to
      hold the result.
      
      this whole framework is really ugly and might should be replaced or at
      least heavily overhauled when some changes/factorizations are made to
      getaddrinfo internals in the future.
      a47ad3eb
    • R
      c0193550
    • R
      b0302863
    • R
      fix error returns in gethostby*_r functions · 70b584bc
      Rich Felker 提交于
      they're supposed to return an error code rather than using errno.
      70b584bc
    • R
      fix uninitialized map_len being used in munmap failure paths in load_library · 74025c80
      Rich Felker 提交于
      this bug seems to have been introduced when the map_library signatures
      was changed to return the mapping in a temp dso structure instead of
      into separate variables.
      74025c80
    • R
      fix stale locks left behind when pthread_create fails · 72768ea9
      Rich Felker 提交于
      this bug seems to have been around a long time.
      72768ea9
    • 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
  4. 01 2月, 2013 2 次提交
  5. 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
  6. 27 1月, 2013 1 次提交
  7. 24 1月, 2013 3 次提交
  8. 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
  9. 17 1月, 2013 2 次提交
  10. 15 1月, 2013 2 次提交
  11. 14 1月, 2013 4 次提交
  12. 13 1月, 2013 9 次提交