1. 15 9月, 2013 2 次提交
    • S
      support configurable page size on mips, powerpc and microblaze · b20760c0
      Szabolcs Nagy 提交于
      PAGE_SIZE was hardcoded to 4096, which is historically what most
      systems use, but on several archs it is a kernel config parameter,
      user space can only know it at execution time from the aux vector.
      
      PAGE_SIZE and PAGESIZE are not defined on archs where page size is
      a runtime parameter, applications should use sysconf(_SC_PAGE_SIZE)
      to query it. Internally libc code defines PAGE_SIZE to libc.page_size,
      which is set to aux[AT_PAGESZ] in __init_libc and early in __dynlink
      as well. (Note that libc.page_size can be accessed without GOT, ie.
      before relocations are done)
      
      Some fpathconf settings are hardcoded to 4096, these should be actually
      queried from the filesystem using statfs.
      b20760c0
    • R
      fix child stack alignment on mips clone · bfba15c9
      Rich Felker 提交于
      unlike other archs, the mips version of clone was not doing anything
      to align the stack pointer. this seems to have been the cause for some
      SIGBUS crashes that were observed in posix_spawn.
      bfba15c9
  2. 03 9月, 2013 3 次提交
  3. 01 8月, 2013 1 次提交
    • R
      in pthread_getattr_np, use mremap rather than madvise to measure stack · 5db951ef
      Rich Felker 提交于
      the original motivation for this patch was that qemu (and possibly
      other syscall emulators) nop out madvise, resulting in an infinite
      loop. however, there is another benefit to this change: madvise may
      actually undo an explicit madvise the application intended for its
      stack, whereas the mremap operation is a true nop. the logic here is
      that mremap must fail if it cannot resize the mapping in-place, and
      the caller knows that it cannot resize in-place because it knows the
      next page of virtual memory is already occupied.
      5db951ef
  4. 23 7月, 2013 1 次提交
  5. 27 6月, 2013 5 次提交
  6. 08 6月, 2013 1 次提交
    • R
      support cputime clocks for processes/threads other than self · ea200e38
      Rich Felker 提交于
      apparently these features have been in Linux for a while now, so it
      makes sense to support them. the bit twiddling seems utterly illogical
      and wasteful, especially the negation, but that's how the kernel folks
      chose to encode pids/tids into the clock id.
      ea200e38
  7. 04 6月, 2013 1 次提交
  8. 27 4月, 2013 8 次提交
  9. 06 4月, 2013 1 次提交
  10. 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
  11. 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
  12. 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
  13. 27 11月, 2012 1 次提交
  14. 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
  15. 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
  16. 15 11月, 2012 1 次提交
  17. 14 11月, 2012 2 次提交
  18. 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
  19. 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
  20. 19 10月, 2012 1 次提交