Page MenuHomeFreeBSD

D58152.diff
No OneTemporary

D58152.diff

diff --git a/lib/libc/gen/dlfcn.c b/lib/libc/gen/dlfcn.c
--- a/lib/libc/gen/dlfcn.c
+++ b/lib/libc/gen/dlfcn.c
@@ -168,7 +168,19 @@
static pthread_once_t dl_phdr_info_once = PTHREAD_ONCE_INIT;
static struct dl_phdr_info phdr_info;
#ifndef PIC
-static mutex_t dl_phdr_info_lock = MUTEX_INITIALIZER;
+static mutex_t dl_phdr_info_lock;
+static pthread_once_t dl_phdr_info_lock_once = PTHREAD_ONCE_INIT;
+
+static void
+dl_phdr_info_lock_init(void)
+{
+ pthread_mutexattr_t ma;
+
+ _pthread_mutexattr_init(&ma);
+ _pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE);
+ _pthread_mutex_init(&dl_phdr_info_lock, &ma);
+ _pthread_mutexattr_destroy(&ma);
+}
#endif
static void
@@ -244,11 +256,15 @@
int error;
#if !defined(IN_LIBDL) && !defined(PIC)
- mutex_lock(&dl_phdr_info_lock);
+ if (__isthreaded) {
+ _once(&dl_phdr_info_lock_once, dl_phdr_info_lock_init);
+ _pthread_mutex_lock(&dl_phdr_info_lock);
+ }
#endif
error = _dl_iterate_phdr_locked(callback, data);
#if !defined(IN_LIBDL) && !defined(PIC)
- mutex_unlock(&dl_phdr_info_lock);
+ if (__isthreaded)
+ _pthread_mutex_unlock(&dl_phdr_info_lock);
#endif
return (error);
}

File Metadata

Mime Type
text/plain
Expires
Thu, Jul 16, 8:34 AM (16 h, 43 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34959722
Default Alt Text
D58152.diff (1 KB)

Event Timeline