summaryrefslogtreecommitdiff
path: root/lang/spl/patches/patch-aa
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);
 }