blob: fe64faddbf366fee697f5ba9f33605a94111ff55 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
$NetBSD: patch-aa,v 1.2 2007/03/17 08:45:04 obache Exp $
--- clib.c.orig 2006-11-14 13:54:32.000000000 +0000
+++ clib.c
@@ -402,13 +402,40 @@ static inline void DO_UNLOCK() {
# else
-static pthread_mutex_t load_unload_lck = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+static int load_unload_initialised;
+static pthread_mutex_t load_unload_init_lck = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t load_unload_lck;
+
+static void DO_LOCK_INIT(void)
+{
+ pthread_mutexattr_t mattr;
+
+ pthread_mutex_lock(&load_unload_init_lck);
+
+ if (load_unload_initialised) {
+ pthread_mutex_unlock(&load_unload_init_lck);
+ return;
+ }
+
+ pthread_mutexattr_init(&mattr);
+ pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(&load_unload_lck, &mattr);
+ pthread_mutexattr_destroy(&mattr);
+
+ load_unload_initialised = 1;
+
+ pthread_mutex_unlock(&load_unload_init_lck);
+}
static inline void DO_LOCK() {
+ if (!load_unload_initialised)
+ DO_LOCK_INIT();
pthread_mutex_lock(&load_unload_lck);
}
static inline void DO_UNLOCK() {
+ if (!load_unload_initialised)
+ DO_LOCK_INIT();
pthread_mutex_unlock(&load_unload_lck);
}
|