1. 03 4月, 2021 1 次提交
    • X
      signal · c78edff7
      x_xiny 提交于
      Change-Id: Iacf0cc5918e3aad5def71aedbd048bd5d21ccca5
      c78edff7
  2. 11 3月, 2021 1 次提交
  3. 18 8月, 2020 1 次提交
  4. 17 8月, 2020 1 次提交
  5. 18 8月, 2019 1 次提交
  6. 19 12月, 2018 1 次提交
    • R
      add __timedwait backend workaround for old kernels where futex EINTRs · a63c0104
      Rich Felker 提交于
      prior to linux 2.6.22, futex wait could fail with EINTR even for
      non-interrupting (SA_RESTART) signals. this was no problem provided
      the caller simply restarted the wait, but sem_[timed]wait is required
      by POSIX to return when interrupted by a signal. commit
      a113434c introduced this behavior, and
      commit c0ed5a20 reverted it based on a
      mistaken belief that it was not required. this belief stems from a bug
      in the specification: the description requires the function to return
      when interrupted, but the errors section marks EINTR as a "may fail"
      condition rather than a "shall fail" one.
      
      since there does seem to be significant value in the change made in
      commit c0ed5a20, making it so that
      programs that call sem_wait without checking for EINTR don't silently
      make forward progress without obtaining the semaphore or treat it as a
      fatal error and abort, add a behind-the-scenes mechanism in the
      __timedwait backend to suppress EINTR in programs that have never
      installed interrupting signal handlers, and have sigaction track and
      report this state. this way the semaphore code is not cluttered by
      workarounds and can be updated (to be done in next commit) to reflect
      the high-level logic for conforming behavior.
      
      these changes are based loosely on a patch by Markus Wichmann, with
      the main changes being atomic update to flag object and moving the
      workaround from sem_timedwait to the __timedwait futex backend.
      a63c0104
  7. 13 9月, 2018 1 次提交
    • R
      split internal lock API out of libc.h, creating lock.h · 5f12ffe1
      Rich Felker 提交于
      this further reduces the number of source files which need to include
      libc.h and thereby be potentially exposed to libc global state and
      internals.
      
      this will also facilitate further improvements like adding an inline
      fast-path, if we want to do so later.
      5f12ffe1
  8. 06 9月, 2018 1 次提交
    • R
      define and use internal macros for hidden visibility, weak refs · 9b95fd09
      Rich Felker 提交于
      this cleans up what had become widespread direct inline use of "GNU C"
      style attributes directly in the source, and lowers the barrier to
      increased use of hidden visibility, which will be useful to recovering
      some of the efficiency lost when the protected visibility hack was
      dropped in commit dc2f368e, especially
      on archs where the PLT ABI is costly.
      9b95fd09
  9. 02 9月, 2018 1 次提交
  10. 01 9月, 2018 1 次提交
    • R
      always terminate by SIGABRT when abort is called · 9b14ad54
      Rich Felker 提交于
      Linux makes this surprisingly difficult, but it can be done. the trick
      here is using the fact that we control the implementation of sigaction
      to prevent changing the disposition of SIGABRT to anything but SIG_DFL
      after abort has tried and failed to terminate the process simply by
      calling raise(SIGABRT).
      9b14ad54
  11. 16 12月, 2015 1 次提交
  12. 24 9月, 2015 1 次提交
    • R
      fix signal return for sh/fdpic · b61df229
      Rich Felker 提交于
      the restorer function pointer provided in the kernel sigaction
      structure is interpreted by the kernel as a raw code address, not a
      function descriptor.
      
      this commit moves the declarations of the __restore and __restore_rt
      symbols to ksigaction.h so that arch versions of the file can override
      them, and introduces a version for sh which declares them as objects
      rather than functions.
      
      an alternate solution would have been defining SA_RESTORER to 0 so
      that the functions are not used, but this both requires executable
      stack (since the sh kernel does not have a vdso page with permanent
      restorer functions) and crashes on qemu user-level emulation.
      b61df229
  13. 25 3月, 2014 1 次提交
    • R
      always initialize thread pointer at program start · dab441ae
      Rich Felker 提交于
      this is the first step in an overhaul aimed at greatly simplifying and
      optimizing everything dealing with thread-local state.
      
      previously, the thread pointer was initialized lazily on first access,
      or at program startup if stack protector was in use, or at certain
      random places where inconsistent state could be reached if it were not
      initialized early. while believed to be fully correct, the logic was
      fragile and non-obvious.
      
      in the first phase of the thread pointer overhaul, support is retained
      (and in some cases improved) for systems/situation where loading the
      thread pointer fails, e.g. old kernels.
      
      some notes on specific changes:
      
      - the confusing use of libc.main_thread as an indicator that the
        thread pointer is initialized is eliminated in favor of an explicit
        has_thread_pointer predicate.
      
      - sigaction no longer needs to ensure that the thread pointer is
        initialized before installing a signal handler (this was needed to
        prevent a situation where the signal handler caused the thread
        pointer to be initialized and the subsequent sigreturn cleared it
        again) but it still needs to ensure that implementation-internal
        thread-related signals are not blocked.
      
      - pthread tsd initialization for the main thread is deferred in a new
        manner to minimize bloat in the static-linked __init_tp code.
      
      - pthread_setcancelstate no longer needs special handling for the
        situation before the thread pointer is initialized. it simply fails
        on systems that cannot support a thread pointer, which are
        non-conforming anyway.
      
      - pthread_cleanup_push/pop now check for missing thread pointer and
        nop themselves out in this case, so stdio no longer needs to avoid
        the cancellable path when the thread pointer is not available.
      
      a number of cases remain where certain interfaces may crash if the
      system does not support a thread pointer. at this point, these should
      be limited to pthread interfaces, and the number of such cases should
      be fewer than before.
      dab441ae
  14. 12 12月, 2013 1 次提交
  15. 10 8月, 2013 1 次提交
    • R
      optimize posix_spawn to avoid spurious sigaction syscalls · 3c5c5e6f
      Rich Felker 提交于
      the trick here is that sigaction can track for us which signals have
      ever had a signal handler set for them, and only those signals need to
      be considered for reset. this tracking mask may have false positives,
      since it is impossible to remove bits from it without race conditions.
      false negatives are not possible since the mask is updated with atomic
      operations prior to making the sigaction syscall.
      
      implementation-internal signals are set to SIG_IGN rather than SIG_DFL
      so that a signal raised in the parent (e.g. calling pthread_cancel on
      the thread executing pthread_spawn) does not have any chance make it
      to the child, where it would cause spurious termination by signal.
      
      this change reduces the minimum/typical number of syscalls in the
      child from around 70 to 4 (including execve). this should greatly
      improve the performance of posix_spawn and other interfaces which use
      it (popen and system).
      
      to facilitate these changes, sigismember is also changed to return 0
      rather than -1 for invalid signals, and to return the actual status of
      implementation-internal signals. POSIX allows but does not require an
      error on invalid signal numbers, and in fact returning an error tends
      to confuse applications which wrongly assume the return value of
      sigismember is boolean.
      3c5c5e6f
  16. 30 7月, 2013 1 次提交
    • T
      use separate sigaction buffers for old and new data · 48748143
      Timo Teräs 提交于
      in signal() it is needed since __sigaction uses restrict in parameters
      and sharing the buffer is technically an aliasing error. do the same
      for the syscall, as at least qemu-user does not handle it properly.
      48748143
  17. 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
  18. 12 10月, 2012 1 次提交
  19. 07 9月, 2012 1 次提交
    • 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
  20. 11 7月, 2012 2 次提交
  21. 28 2月, 2012 1 次提交
    • R
      work around "signal loses thread pointer" issue with "approach 2" · dac084a4
      Rich Felker 提交于
      this was discussed on the mailing list and no consensus on the
      preferred solution was reached, so in anticipation of a release, i'm
      just committing a minimally-invasive solution that avoids the problem
      by ensuring that multi-threaded-capable programs will always have
      initialized the thread pointer before any signal handler can run.
      
      in the long term we may switch to initializing the thread pointer at
      program start time whenever the program has the potential to access
      any per-thread data.
      dac084a4
  22. 08 5月, 2011 1 次提交
    • R
      overhaul implementation-internal signal protections · 99b8a25e
      Rich Felker 提交于
      the new approach relies on the fact that the only ways to create
      sigset_t objects without invoking UB are to use the sig*set()
      functions, or from the masks returned by sigprocmask, sigaction, etc.
      or in the ucontext_t argument to a signal handler. thus, as long as
      sigfillset and sigaddset avoid adding the "protected" signals, there
      is no way the application will ever obtain a sigset_t including these
      bits, and thus no need to add the overhead of checking/clearing them
      when sigprocmask or sigaction is called.
      
      note that the old code actually *failed* to remove the bits from
      sa_mask when sigaction was called.
      
      the new implementations are also significantly smaller, simpler, and
      faster due to ignoring the useless "GNU HURD signals" 65-1024, which
      are not used and, if there's any sanity in the world, never will be
      used.
      99b8a25e
  23. 15 4月, 2011 1 次提交
  24. 20 3月, 2011 1 次提交
  25. 14 2月, 2011 2 次提交
  26. 12 2月, 2011 1 次提交