git: DragonFly_RELEASE_5_0 libthread_xu - Fix rtld and refactor locks

Matthew Dillon dillon at crater.dragonflybsd.org
Wed Nov 1 19:32:12 PDT 2017


commit fefb3800a78340a4b6cc752d8fa1023cfa359471
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date:   Wed Nov 1 17:18:56 2017 -0700

    libthread_xu - Fix rtld and refactor locks
    
    * Add a separate atfork facility for internal pthread atfork entities
      (sem and rtld) which must execute after all user atfork entities
      pre-fork and before all user atfork entities post-fork.
    
    * Install an atfork handler for rtld-elf (also requires rtld-elf to
      be updated).  The handler will ensure that RTLD locks are in a sane
      state prior to fork (by acquiring them), and will then release the
      locks post-fork.  This is the primary fix for lang/rust and cargo.
    
      Also do not issue _thr_rtld_fini() when threading drops to 0.
      Once threading has been set, rtld's pthread locks remain installed.
    
    * Refactor thr_cond.c.  Refactor condition variables to perform
      according to the spec.  Use a TAILQ to make pthread_cond_signal()
      work exactly as described in the manual (that is, waking up only
      one waiter at a time).
    
    * Refactor thr_mutex.c.  Primary instrument for debugging and
      clean up.  Also deal with improper EINTR handling.
    
    * Refactor thr_fork.c.  Implement the new atfork facility for
      internal atfork handlers.
    
    * Refactor thr_rwlock.c.  Add debugging, cleanup.
    
    * thr_sem.c now uses the internal atfork handler to ensure proper
      ordering.
    
    * thr_sig.c implements debugging features.
    
    * Refactor thr_umtx.c... the low level mutex code.  Store the id
      for additonal verification and use an atomic lock to clear the
      lock instead of an assignment.  Properly ignore EINTR.
    
    * Cleanup init_private() a bit.
    
    * Add PTHREADS_DEBUGGING=TRUE and PTHREADS_DEBUGGING2=TRUE make
      flags.  The first writes out a garbage file in /tmp for all
      locking operations as they occur.  The second is used for
      point debugging and writes out a file when signal 63 is sent
      to the program.
    
    * Add cpu_ccfence() in various places that might need it (a hack
      for the moment, userland cannot currently #include
      "machine/cpufunc.h").
    
    * Should fix lang/rust and 'cargo'

Summary of changes:
 lib/libthread_xu/Makefile             |   9 ++
 lib/libthread_xu/thread/thr_cond.c    | 180 ++++++++++++++++++++++++----------
 lib/libthread_xu/thread/thr_fork.c    |  57 ++++++++++-
 lib/libthread_xu/thread/thr_init.c    |  25 ++---
 lib/libthread_xu/thread/thr_join.c    |   2 +-
 lib/libthread_xu/thread/thr_kern.c    |   8 +-
 lib/libthread_xu/thread/thr_mutex.c   | 146 +++++++++++++++++++++------
 lib/libthread_xu/thread/thr_private.h |  35 +++++--
 lib/libthread_xu/thread/thr_rtld.c    |   9 ++
 lib/libthread_xu/thread/thr_rwlock.c  | 132 +++++++++++++++++++++----
 lib/libthread_xu/thread/thr_sem.c     |  33 +++++--
 lib/libthread_xu/thread/thr_sig.c     |  93 ++++++++++++++++++
 lib/libthread_xu/thread/thr_umtx.c    |  53 ++++++----
 lib/libthread_xu/thread/thr_umtx.h    |  32 +++---
 14 files changed, 641 insertions(+), 173 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/fefb3800a78340a4b6cc752d8fa1023cfa359471


-- 
DragonFly BSD source repository



More information about the Commits mailing list