summaryrefslogtreecommitdiffstats
path: root/winsup/mingw/tlsmthread.c
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/mingw/tlsmthread.c')
-rw-r--r--winsup/mingw/tlsmthread.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/winsup/mingw/tlsmthread.c b/winsup/mingw/tlsmthread.c
new file mode 100644
index 000000000..f30e70137
--- /dev/null
+++ b/winsup/mingw/tlsmthread.c
@@ -0,0 +1,59 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ *
+ * Written by Kai Tietz <kai.tietz@onevision.com>
+ */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#include <stdlib.h>
+
+int __mingwthr_key_dtor (DWORD key, void (*dtor)(void *));
+int __mingwthr_remove_key_dtor (DWORD key);
+
+extern int ___w64_mingwthr_remove_key_dtor (DWORD key);
+extern int ___w64_mingwthr_add_key_dtor (DWORD key, void (*dtor)(void *));
+
+
+#ifndef _WIN64
+#define MINGWM10_DLL "mingwm10.dll"
+typedef int (*fMTRemoveKeyDtor)(DWORD key);
+typedef int (*fMTKeyDtor)(DWORD key, void (*dtor)(void *));
+extern fMTRemoveKeyDtor __mingw_gMTRemoveKeyDtor;
+extern fMTKeyDtor __mingw_gMTKeyDtor;
+extern int __mingw_usemthread_dll;
+#endif
+
+int
+__mingwthr_remove_key_dtor (DWORD key)
+{
+#ifndef _WIN64
+ if (!__mingw_usemthread_dll)
+#endif
+ return ___w64_mingwthr_remove_key_dtor (key);
+#ifndef _WIN64
+ if (__mingw_gMTRemoveKeyDtor)
+ return (*__mingw_gMTRemoveKeyDtor) (key);
+ return 0;
+#endif
+}
+
+int
+__mingwthr_key_dtor (DWORD key, void (*dtor)(void *))
+{
+ if (dtor)
+ {
+#ifndef _WIN64
+ if (!__mingw_usemthread_dll)
+#endif
+ return ___w64_mingwthr_add_key_dtor (key, dtor);
+#ifndef _WIN64
+ if (__mingw_gMTKeyDtor)
+ return (*__mingw_gMTKeyDtor) (key, dtor);
+#endif
+ }
+ return 0;
+}