• 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
sigaction.c 1.8 KB