ld.so no longer needs or uses a bind lock, so stop setting it. This
authorguenther <guenther@openbsd.org>
Sun, 18 Oct 2015 08:02:58 +0000 (08:02 +0000)
committerguenther <guenther@openbsd.org>
Sun, 18 Oct 2015 08:02:58 +0000 (08:02 +0000)
eliminates a chunk of complexity from the libpthread init and the fork
wrapper, as it was the bind lock that needed prebinding before use.

lib/librthread/rthread.c
lib/librthread/rthread.h
lib/librthread/rthread_fork.c

index aff3817..c0c692d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rthread.c,v 1.83 2015/05/19 20:50:06 guenther Exp $ */
+/*     $OpenBSD: rthread.c,v 1.84 2015/10/18 08:02:58 guenther Exp $ */
 /*
  * Copyright (c) 2004,2005 Ted Unangst <tedu@openbsd.org>
  * All Rights Reserved.
@@ -207,18 +207,7 @@ _rthread_init(void)
 
 #ifndef NO_PIC
        if (_DYNAMIC) {
-               /*
-                * To avoid recursion problems in ld.so, we need to trigger the
-                * functions once to fully bind them before registering them
-                * for use.
-                */
-               _rthread_dl_lock(0);
-               _rthread_dl_lock(1);
-               _rthread_bind_lock(0);
-               _rthread_bind_lock(1);
-               sched_yield();
                dlctl(NULL, DL_SETTHREADLCK, _rthread_dl_lock);
-               dlctl(NULL, DL_SETBINDLCK, _rthread_bind_lock);
        }
 #endif
 
@@ -709,17 +698,6 @@ _rthread_dl_lock(int what)
                TAILQ_INIT(&lockers);
        }
 }
-
-void
-_rthread_bind_lock(int what)
-{
-       static struct _spinlock lock = _SPINLOCK_UNLOCKED;
-
-       if (what == 0)
-               _spinlock(&lock);
-       else
-               _spinunlock(&lock);
-}
 #endif
 
 
index 7176252..177f31d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rthread.h,v 1.52 2015/05/19 20:50:06 guenther Exp $ */
+/*     $OpenBSD: rthread.h,v 1.53 2015/10/18 08:02:58 guenther Exp $ */
 /*
  * Copyright (c) 2004,2005 Ted Unangst <tedu@openbsd.org>
  * All Rights Reserved.
@@ -221,7 +221,6 @@ void        _rthread_debug(int, const char *, ...)
 void   _rthread_debug_init(void);
 #ifndef NO_PIC
 void   _rthread_dl_lock(int what);
-void   _rthread_bind_lock(int);
 #endif
 
 /* rthread_cancel.c */
index a1cda56..1812127 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rthread_fork.c,v 1.13 2015/05/19 20:50:06 guenther Exp $ */
+/*     $OpenBSD: rthread_fork.c,v 1.14 2015/10/18 08:02:58 guenther Exp $ */
 
 /*
  * Copyright (c) 2008 Kurt Miller <kurt@openbsd.org>
@@ -40,7 +40,6 @@
 #include <pthread.h>
 #include <stdlib.h>
 #include <unistd.h>
-#include <signal.h>
 
 #include "thread_private.h"    /* in libc/include */
 
@@ -56,9 +55,6 @@ _dofork(int is_vfork)
        pthread_t me;
        pid_t (*sys_fork)(void);
        pid_t newid;
-#ifndef NO_PIC
-       sigset_t nmask, omask;
-#endif
 
        sys_fork = is_vfork ? &_thread_sys_vfork : &_thread_sys_fork;
 
@@ -70,9 +66,8 @@ _dofork(int is_vfork)
        /*
         * Protect important libc/ld.so critical areas across the fork call.
         * dlclose() will grab the atexit lock via __cxa_finalize() so lock
-        * the dl_lock first. malloc()/free() can grab the arc4 lock so lock
-        * malloc_lock first. Finally lock the bind_lock last so that any lazy
-        * binding in the other locking functions can succeed.
+        * the dl_lock first. malloc()/free() can use arc4random(), so lock
+        * malloc_lock before arc4_lock
         */
 
 #ifndef NO_PIC
@@ -84,23 +79,8 @@ _dofork(int is_vfork)
        _thread_malloc_lock();
        _thread_arc4_lock();
 
-#ifndef NO_PIC
-       if (_DYNAMIC) {
-               sigfillset(&nmask);
-               _thread_sys_sigprocmask(SIG_BLOCK, &nmask, &omask);
-               _rthread_bind_lock(0);
-       }
-#endif
-
        newid = sys_fork();
 
-#ifndef NO_PIC
-       if (_DYNAMIC) {
-               _rthread_bind_lock(1);
-               _thread_sys_sigprocmask(SIG_SETMASK, &omask, NULL);
-       }
-#endif
-
        _thread_arc4_unlock();
        _thread_malloc_unlock();
        _thread_atexit_unlock();