1. 01 4月, 2013 1 次提交
    • R
      implement pthread_getattr_np · 14a835b3
      Rich Felker 提交于
      this function is mainly (purely?) for obtaining stack address
      information, but we also provide the detach state since it's easy to
      do anyway.
      14a835b3
  2. 27 3月, 2013 1 次提交
    • R
      remove __SYSCALL_SSLEN arch macro in favor of using public _NSIG · ccc7b4c3
      Rich Felker 提交于
      the issue at hand is that many syscalls require as an argument the
      kernel-ABI size of sigset_t, intended to allow the kernel to switch to
      a larger sigset_t in the future. previously, each arch was defining
      this size in syscall_arch.h, which was redundant with the definition
      of _NSIG in bits/signal.h. as it's used in some not-quite-portable
      application code as well, _NSIG is much more likely to be recognized
      and understood immediately by someone reading the code, and it's also
      shorter and less cluttered.
      
      note that _NSIG is actually 65/129, not 64/128, but the division takes
      care of throwing away the off-by-one part.
      ccc7b4c3
  3. 02 2月, 2013 4 次提交
    • 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
      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
  4. 27 11月, 2012 1 次提交
  5. 19 11月, 2012 2 次提交
    • R
      powerpc: handle syscall error in clone. · 3fae236e
      rofl0r 提交于
      sigsetjmp: store temporaries in jmp_buf rather than on stack.
      3fae236e
    • R
      fix powerpc asm not to store data in volatile space below stack pointer · 9565a349
      Rich Felker 提交于
      it's essential to decrement the stack pointer before writing to new
      stack space, rather than afterwards. otherwise there is a race
      condition during which asynchronous code (signals) could clobber the
      data being stored.
      
      it may be possible to optimize the code further using stwu, but I
      wanted to avoid making any changes to the actual stack layout in this
      commit. further improvements can be made separately if desired.
      9565a349
  6. 18 11月, 2012 1 次提交
    • R
      add stub versions of some missing optional pthread interfaces · 5c6443ac
      Rich Felker 提交于
      priority inheritance is not yet supported, and priority protection
      probably will not be supported ever unless there's serious demand for
      it (it's a fairly heavy-weight feature).
      
      per-thread cpu clocks would be nice to have, but to my knowledge linux
      is still not capable of supporting them. glibc fakes them by using the
      _process_ cpu-time clock and subtracting the thread creation time,
      which gives seriously incorrect semantics (worse than not supporting
      the feature at all), so until there's a way to do it right, it will
      remain as a stub that always fails.
      5c6443ac
  7. 15 11月, 2012 1 次提交
  8. 14 11月, 2012 2 次提交
  9. 12 11月, 2012 2 次提交
    • R
      debloat src/thread tree but putting lots of junk in one file · c4a35f8c
      Rich Felker 提交于
      POSIX includes mostly-useless attribute-get functions for each
      attribute-set function, presumably out of some object-oriented
      dogmatism. the get functions are not useful with the simple idiomatic
      usage of attributes. there are of course possible valid uses of them
      (like writing wrappers for pthread init functions that perform special
      actions on the presence of certain attributes), but considering how
      tiny these functions are anyway, little is lost by putting them all in
      one file, and some build-time cost and archive-file-size benefits are
      achieved.
      c4a35f8c
    • R
      add support for thread scheduling (POSIX TPS option) · 1e21e78b
      Rich Felker 提交于
      linux's sched_* syscalls actually implement the TPS (thread
      scheduling) functionality, not the PS (process scheduling)
      functionality which the sched_* functions are supposed to have.
      omitting support for the PS option (and having the sched_* interfaces
      fail with ENOSYS rather than omitting them, since some broken software
      assumes they exist) seems to be the only conforming way to do this on
      linux.
      1e21e78b
  10. 09 11月, 2012 1 次提交
    • R
      clean up sloppy nested inclusion from pthread_impl.h · efd4d87a
      Rich Felker 提交于
      this mirrors the stdio_impl.h cleanup. one header which is not
      strictly needed, errno.h, is left in pthread_impl.h, because since
      pthread functions return their error codes rather than using errno,
      nearly every single pthread function needs the errno constants.
      
      in a few places, rather than bringing in string.h to use memset, the
      memset was replaced by direct assignment. this seems to generate much
      better code anyway, and makes many functions which were previously
      non-leaf functions into leaf functions (possibly eliminating a great
      deal of bloat on some platforms where non-leaf functions require ugly
      prologue and/or epilogue).
      efd4d87a
  11. 19 10月, 2012 2 次提交
  12. 18 10月, 2012 1 次提交
  13. 16 10月, 2012 1 次提交
    • R
      add support for TLS variant I, presently needed for arm and mips · 9ec4283b
      Rich Felker 提交于
      despite documentation that makes it sound a lot different, the only
      ABI-constraint difference between TLS variants II and I seems to be
      that variant II stores the initial TLS segment immediately below the
      thread pointer (i.e. the thread pointer points to the end of it) and
      variant I stores the initial TLS segment above the thread pointer,
      requiring the thread descriptor to be stored below. the actual value
      stored in the thread pointer register also tends to have per-arch
      random offsets applied to it for silly micro-optimization purposes.
      
      with these changes applied, TLS should be basically working on all
      supported archs except microblaze. I'm still working on getting the
      necessary information and a working toolchain that can build TLS
      binaries for microblaze, but in theory, static-linked programs with
      TLS and dynamic-linked programs where only the main executable uses
      TLS should already work on microblaze.
      
      alignment constraints have not yet been heavily tested, so it's
      possible that this code does not always align TLS segments correctly
      on archs that need TLS variant I.
      9ec4283b
  14. 15 10月, 2012 1 次提交
  15. 08 10月, 2012 1 次提交
    • R
      clean up and refactor program initialization · 0a96a37f
      Rich Felker 提交于
      the code in __libc_start_main is now responsible for parsing auxv,
      rather than duplicating the parsing all over the place. this should
      shave off a few cycles and some code size. __init_libc is left as an
      external-linkage function despite the fact that it could be static, to
      prevent it from being inlined and permanently wasting stack space when
      main is called.
      
      a few other minor changes are included, like eliminating per-thread
      ssp canaries (they were likely broken when combined with certain
      dlopen usages, and completely unnecessary) and some other unnecessary
      checks. since this code gets linked into every program, it should be
      as small and simple as possible.
      0a96a37f
  16. 05 10月, 2012 3 次提交
    • R
      support for TLS in dynamic-loaded (dlopen) modules · dcd60371
      Rich Felker 提交于
      unlike other implementations, this one reserves memory for new TLS in
      all pre-existing threads at dlopen-time, and dlopen will fail with no
      resources consumed and no new libraries loaded if memory is not
      available. memory is not immediately distributed to running threads;
      that would be too complex and too costly. instead, assurances are made
      that threads needing the new TLS can obtain it in an async-signal-safe
      way from a buffer belonging to the dynamic linker/new module (via
      atomic fetch-and-add based allocator).
      
      I've re-appropriated the lock that was previously used for __synccall
      (synchronizing set*id() syscalls between threads) as a general
      pthread_create lock. it's a "backwards" rwlock where the "read"
      operation is safe atomic modification of the live thread count, which
      multiple threads can perform at the same time, and the "write"
      operation is making sure the count does not increase during an
      operation that depends on it remaining bounded (__synccall or dlopen).
      in static-linked programs that don't use __synccall, this lock is a
      no-op and has no cost.
      dcd60371
    • R
      beginnings of full TLS support in shared libraries · 9b153c04
      Rich Felker 提交于
      this code will not work yet because the necessary relocations are not
      supported, and cannot be supported without some internal changes to
      how relocation processing works (coming soon).
      9b153c04
    • R
      TLS (GNU/C11 thread-local storage) support for static-linked programs · 8431d797
      Rich Felker 提交于
      the design for TLS in dynamic-linked programs is mostly complete too,
      but I have not yet implemented it. cost is nonzero but still low for
      programs which do not use TLS and/or do not use threads (a few hundred
      bytes of new code, plus dependency on memcpy). i believe it can be
      made smaller at some point by merging __init_tls and __init_security
      into __libc_start_main and avoiding duplicate auxv-parsing code.
      
      at the same time, I've also slightly changed the logic pthread_create
      uses to allocate guard pages to ensure that guard pages are not
      counted towards commit charge.
      8431d797
  17. 01 10月, 2012 2 次提交
    • R
      protect sem_open against cancellation · e44849f5
      Rich Felker 提交于
      also fix one minor bug: failure to free the early-reserved slot when
      the semaphore later found to already be mapped.
      e44849f5
    • R
      overhaul sem_open · bf258341
      Rich Felker 提交于
      this function was overly complicated and not even obviously correct.
      avoid using openat/linkat just like in shm_open, and instead expand
      pathname using code shared with shm_open. remove bogus (and dangerous,
      with priorities) use of spinlocks.
      
      this commit also heavily streamlines the code and ensures there are no
      failure cases that can happen after a new semaphore has been created
      in the filesystem, since that case is unreportable.
      bf258341
  18. 30 9月, 2012 2 次提交
  19. 29 9月, 2012 2 次提交
  20. 28 9月, 2012 1 次提交
  21. 15 9月, 2012 1 次提交
  22. 09 9月, 2012 1 次提交
  23. 07 9月, 2012 2 次提交
    • R
      further use of _Noreturn, for non-plain-C functions · 0c05bd3a
      Rich Felker 提交于
      note that POSIX does not specify these functions as _Noreturn, because
      POSIX is aligned with C99, not the new C11 standard. when POSIX is
      eventually updated to C11, it will almost surely give these functions
      the _Noreturn attribute. for now, the actual _Noreturn keyword is not
      used anyway when compiling with a c99 compiler, which is what POSIX
      requires; the GCC __attribute__ is used instead if it's available,
      however.
      
      in a few places, I've added infinite for loops at the end of _Noreturn
      functions to silence compiler warnings. presumably
      __buildin_unreachable could achieve the same thing, but it would only
      work on newer GCCs and would not be portable. the loops should have
      near-zero code size cost anyway.
      
      like the previous _Noreturn commit, this one is based on patches
      contributed by philomath.
      0c05bd3a
    • R
      use restrict everywhere it's required by c99 and/or posix 2008 · 400c5e5c
      Rich Felker 提交于
      to deal with the fact that the public headers may be used with pre-c99
      compilers, __restrict is used in place of restrict, and defined
      appropriately for any supported compiler. we also avoid the form
      [restrict] since older versions of gcc rejected it due to a bug in the
      original c99 standard, and instead use the form *restrict.
      400c5e5c
  24. 18 8月, 2012 1 次提交
    • R
      fix extremely rare but dangerous race condition in robust mutexes · da8d0fc4
      Rich Felker 提交于
      if new shared mappings of files/devices/shared memory can be made
      between the time a robust mutex is unlocked and its subsequent removal
      from the pending slot in the robustlist header, the kernel can
      inadvertently corrupt data in the newly-mapped pages when the process
      terminates. i am fixing the bug by using the same global vm lock
      mechanism that was used to fix the race condition with unmapping
      barriers after pthread_barrier_wait returns.
      da8d0fc4
  25. 10 8月, 2012 1 次提交
    • R
      fix (hopefully) all hard-coded 8's for kernel sigset_t size · 2f437040
      Rich Felker 提交于
      some minor changes to how hard-coded sets for thread-related purposes
      are handled were also needed, since the old object sizes were not
      necessarily sufficient. things have gotten a bit ugly in this area,
      and i think a cleanup is in order at some point, but for now the goal
      is just to get the code working on all supported archs including mips,
      which was badly broken by linux rejecting syscalls with the wrong
      sigset_t size.
      2f437040
  26. 24 7月, 2012 1 次提交
    • R
      retry on cas failures in sem_trywait · 07e62953
      Rich Felker 提交于
      this seems counter-intuitive since sem_trywait is supposed to just try
      once, not wait for the semaphore. however, the retry loop is not a
      wait. instead, it's to handle the case where the value changes due to
      a simultaneous post or wait from another thread while the semaphore
      value remains positive. in such a case, it's absolutely wrong for
      sem_trywait to fail with EAGAIN because the semaphore is not busy.
      07e62953
  27. 15 7月, 2012 1 次提交