author | Petr Sumbera <petr.sumbera@oracle.com> |
Thu, 09 May 2013 23:58:19 -0700 | |
branch | s11-update |
changeset 2620 | 70885a8bb9bc |
permissions | -rw-r--r-- |
2620
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
1 |
https://bugzilla.gnome.org/show_bug.cgi?id=697264 |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
2 |
https://git.gnome.org/browse/libxml2/commit/?id=5fe9e9ed1ccf217e11bd3cb99b1c6bb10cc96ba3 |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
3 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
4 |
From 5fe9e9ed1ccf217e11bd3cb99b1c6bb10cc96ba3 Mon Sep 17 00:00:00 2001 |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
5 |
From: Daniel Veillard <[email protected]> |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
6 |
Date: Fri, 05 Apr 2013 15:10:41 +0000 |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
7 |
Subject: Remove risk of lockup in dictionary initialization |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
8 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
9 |
Reported by Petr Sumbera <[email protected]> |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
10 |
Two threads entering xmlInitializeDict concurently could lead |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
11 |
to a lockup due to multiple initializations of the lock used. |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
12 |
To avoid this problem move this to a new private function |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
13 |
called from xmlOnceInit() and deprecate the old initalizer. |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
14 |
Since threaded programs must call xmlInitParser() and this |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
15 |
will lead to dereference of private data and the call to |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
16 |
xmlOnceInit() guaranteed to be unique this should be safe now. |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
17 |
--- |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
18 |
diff --git a/dict.c b/dict.c |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
19 |
index 164c7f2..5f71d55 100644 |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
20 |
--- a/dict.c |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
21 |
+++ b/dict.c |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
22 |
@@ -151,13 +151,28 @@ static unsigned int rand_seed = 0; |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
23 |
* xmlInitializeDict: |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
24 |
* |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
25 |
* Do the dictionary mutex initialization. |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
26 |
- * this function is not thread safe, initialization should |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
27 |
- * preferably be done once at startup |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
28 |
+ * this function is deprecated |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
29 |
* |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
30 |
* Returns 0 if initialization was already done, and 1 if that |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
31 |
* call led to the initialization |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
32 |
*/ |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
33 |
int xmlInitializeDict(void) { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
34 |
+ return(0); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
35 |
+} |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
36 |
+ |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
37 |
+/** |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
38 |
+ * __xmlInitializeDict: |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
39 |
+ * |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
40 |
+ * This function is not public |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
41 |
+ * Do the dictionary mutex initialization. |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
42 |
+ * this function is not thread safe, initialization should |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
43 |
+ * normally be done once at setup when called from xmlOnceInit() |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
44 |
+ * we may also land in this code if thread support is not compiled in |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
45 |
+ * |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
46 |
+ * Returns 0 if initialization was already done, and 1 if that |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
47 |
+ * call led to the initialization |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
48 |
+ */ |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
49 |
+int __xmlInitializeDict(void) { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
50 |
if (xmlDictInitialized) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
51 |
return(1); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
52 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
53 |
@@ -183,7 +198,7 @@ int __xmlRandom(void) { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
54 |
int ret; |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
55 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
56 |
if (xmlDictInitialized == 0) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
57 |
- xmlInitializeDict(); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
58 |
+ __xmlInitializeDict(); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
59 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
60 |
xmlRMutexLock(xmlDictMutex); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
61 |
#ifdef HAVE_RAND_R |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
62 |
@@ -522,7 +537,7 @@ xmlDictCreate(void) { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
63 |
xmlDictPtr dict; |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
64 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
65 |
if (!xmlDictInitialized) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
66 |
- if (!xmlInitializeDict()) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
67 |
+ if (!__xmlInitializeDict()) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
68 |
return(NULL); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
69 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
70 |
#ifdef DICT_DEBUG_PATTERNS |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
71 |
@@ -590,7 +605,7 @@ xmlDictCreateSub(xmlDictPtr sub) { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
72 |
int |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
73 |
xmlDictReference(xmlDictPtr dict) { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
74 |
if (!xmlDictInitialized) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
75 |
- if (!xmlInitializeDict()) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
76 |
+ if (!__xmlInitializeDict()) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
77 |
return(-1); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
78 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
79 |
if (dict == NULL) return -1; |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
80 |
@@ -754,7 +769,7 @@ xmlDictFree(xmlDictPtr dict) { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
81 |
return; |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
82 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
83 |
if (!xmlDictInitialized) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
84 |
- if (!xmlInitializeDict()) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
85 |
+ if (!__xmlInitializeDict()) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
86 |
return; |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
87 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
88 |
/* decrement the counter, it may be shared by a parser and docs */ |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
89 |
diff --git a/libxml.h b/libxml.h |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
90 |
index 7558b5f..2da9044 100644 |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
91 |
--- a/libxml.h |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
92 |
+++ b/libxml.h |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
93 |
@@ -84,6 +84,8 @@ void __xmlGlobalInitMutexLock(void); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
94 |
void __xmlGlobalInitMutexUnlock(void); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
95 |
void __xmlGlobalInitMutexDestroy(void); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
96 |
|
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
97 |
+int __xmlInitializeDict(void); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
98 |
+ |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
99 |
#if defined(HAVE_RAND) && defined(HAVE_SRAND) && defined(HAVE_TIME) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
100 |
/* |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
101 |
* internal thread safe random function |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
102 |
diff --git a/threads.c b/threads.c |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
103 |
index c8414e1..f2f2703 100644 |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
104 |
--- a/threads.c |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
105 |
+++ b/threads.c |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
106 |
@@ -954,6 +954,7 @@ xmlOnceInit(void) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
107 |
#ifdef HAVE_PTHREAD_H |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
108 |
(void) pthread_key_create(&globalkey, xmlFreeGlobalState); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
109 |
mainthread = pthread_self(); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
110 |
+ __xmlInitializeDict(); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
111 |
#elif defined(HAVE_WIN32_THREADS) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
112 |
if (!run_once.done) { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
113 |
if (InterlockedIncrement(&run_once.control) == 1) { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
114 |
@@ -961,6 +962,7 @@ xmlOnceInit(void) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
115 |
globalkey = TlsAlloc(); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
116 |
#endif |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
117 |
mainthread = GetCurrentThreadId(); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
118 |
+ __xmlInitializeDict(); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
119 |
run_once.done = 1; |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
120 |
} else { |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
121 |
/* Another thread is working; give up our slice and |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
122 |
@@ -974,6 +976,7 @@ xmlOnceInit(void) |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
123 |
globalkey = tls_allocate(); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
124 |
tls_set(globalkey, NULL); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
125 |
mainthread = find_thread(NULL); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
126 |
+ __xmlInitializeDict(); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
127 |
} else |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
128 |
atomic_add(&run_once_init, -1); |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
129 |
#endif |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
130 |
-- |
70885a8bb9bc
15992470 xmlInitializeDict() should not pretend that it is thread-safe
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff
changeset
|
131 |
cgit v0.9.1 |