applied patch from Stephane for threads
diff --git a/threads.c b/threads.c
index 6aa5ecc..a1263fc 100644
--- a/threads.c
+++ b/threads.c
@@ -92,7 +92,7 @@
static __declspec(thread) xmlGlobalState tlstate;
static __declspec(thread) int tlstate_inited = 0;
#else /* HAVE_COMPILER_TLS */
-static DWORD globalkey;
+static DWORD globalkey = TLS_OUT_OF_INDEXES;
#endif /* HAVE_COMPILER_TLS */
static DWORD mainthread;
static int run_once_init = 1;
@@ -323,7 +323,7 @@
#ifdef HAVE_WIN32_THREADS
-#if !defined(HAVE_COMPILER_TLS)
+#if !defined(HAVE_COMPILER_TLS) && defined(LIBXML_STATIC)
typedef struct _xmlGlobalStateCleanupHelperParams
{
HANDLE thread;
@@ -339,7 +339,7 @@
free(params);
_endthread();
}
-#endif /* HAVE_COMPILER_TLS */
+#endif /* HAVE_COMPILER_TLS && LIBXML_STATIC */
#endif /* HAVE_WIN32_THREADS */
/**
@@ -381,13 +381,17 @@
}
if ((globalval = (xmlGlobalState *) TlsGetValue(globalkey)) == NULL) {
xmlGlobalState *tsd = xmlNewGlobalState();
+#if defined(LIBXML_STATIC)
xmlGlobalStateCleanupHelperParams *p =
(xmlGlobalStateCleanupHelperParams *) malloc(sizeof(xmlGlobalStateCleanupHelperParams));
p->memory = tsd;
DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
GetCurrentProcess(), &p->thread, 0, TRUE, DUPLICATE_SAME_ACCESS);
+#endif
TlsSetValue(globalkey, tsd);
+#if defined(LIBXML_STATIC)
_beginthread(xmlGlobalStateCleanupHelper, 0, p);
+#endif
return (tsd);
}
@@ -535,3 +539,34 @@
mainthread = GetCurrentThreadId();
#endif
}
+
+/**
+ * DllMain
+ *
+ * Entry point for Windows library. It is being used to free thread-specific
+ * storage.
+ */
+#if defined(HAVE_WIN32_THREADS) && !defined(LIBXML_STATIC)
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+ switch(fdwReason) {
+ case DLL_THREAD_DETACH:
+ if (globalkey != TLS_OUT_OF_INDEXES) {
+ xmlGlobalState *globalval = (xmlGlobalState *)TlsGetValue(globalkey);
+ if (globalval) {
+ xmlFreeGlobalState(globalval);
+ TlsSetValue(globalkey, NULL);
+ }
+ }
+ break;
+ case DLL_PROCESS_DETACH:
+ if (globalkey != TLS_OUT_OF_INDEXES) {
+ TlsFree(globalkey);
+ globalkey = TLS_OUT_OF_INDEXES;
+ }
+ break;
+ }
+ return TRUE;
+}
+#endif
+