summaryrefslogtreecommitdiff
path: root/dll.c
diff options
context:
space:
mode:
authorrpj <rpj>1998-07-30 13:51:57 +0000
committerrpj <rpj>1998-07-30 13:51:57 +0000
commit94cfb27da3941eea2b20867eacc09a5b91168438 (patch)
treefaf0cfaab11409e9f4aa047f897dd82ca345ed56 /dll.c
parent96600f6d50eeeef1f660352b8455d4df1aed69ff (diff)
Thu Jul 30 23:12:45 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* implement.h: Remove _pthread_find_entry() prototype. * private.c: Extend comments. Remove _pthread_find_entry() - no longer needed. * create.c (_pthread_start_call): Add call to TlsSetValue() to store the thread ID. * dll.c (PthreadsEntryPoint): Implement. This is called whenever a process loads the DLL. Used to initialise thread local storage. * implement.h: Add _pthread_threadID_TlsIndex. Add ()s around _PTHREAD_VALID expression. * misc.c (pthread_self): Re-implement using Win32 TLS to store the threads own ID.
Diffstat (limited to 'dll.c')
-rw-r--r--dll.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/dll.c b/dll.c
new file mode 100644
index 0000000..518d443
--- /dev/null
+++ b/dll.c
@@ -0,0 +1,52 @@
+/*
+ * dll.c
+ *
+ * Description:
+ * This translation unit implements DLL initialisation.
+ */
+
+/* We use the DLL entry point function to set up per thread storage
+ specifically to hold the threads own thread ID.
+
+ The thread ID is stored by _pthread_start_call().
+
+ The thread ID is retrieved by pthread_self().
+
+ */
+
+#include <windows.h>
+
+/* Global index for TLS data. */
+DWORD _pthread_threadID_TlsIndex;
+
+BOOL WINAPI PthreadsEntryPoint(HINSTANCE dllHandle,
+ DWORD reason,
+ LPVOID situation)
+{
+
+
+ switch (reason)
+ {
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ break;
+
+ case DLL_PROCESS_ATTACH:
+ _pthread_threadID_TlsIndex = TlsAlloc();
+
+ if (_pthread_threadID_TlsIndex == 0xFFFFFFFF)
+ {
+ return FALSE;
+ }
+ break;
+
+ case DLL_PROCESS_DETACH:
+ (void) TlsFree(_pthread_threadID_TlsIndex);
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}