apr-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mt...@apache.org
Subject svn commit: r434327 - in /apr/apr/trunk: CHANGES include/arch/win32/apr_arch_threadproc.h misc/win32/start.c threadproc/win32/threadpriv.c
Date Thu, 24 Aug 2006 07:24:36 GMT
Author: mturk
Date: Thu Aug 24 00:24:35 2006
New Revision: 434327

URL: http://svn.apache.org/viewvc?rev=434327&view=rev
Log:
Implement apr_threadkey_private destructors on WIN32
instead silently ignoring them.

Modified:
    apr/apr/trunk/CHANGES
    apr/apr/trunk/include/arch/win32/apr_arch_threadproc.h
    apr/apr/trunk/misc/win32/start.c
    apr/apr/trunk/threadproc/win32/threadpriv.c

Modified: apr/apr/trunk/CHANGES
URL: http://svn.apache.org/viewvc/apr/apr/trunk/CHANGES?rev=434327&r1=434326&r2=434327&view=diff
==============================================================================
--- apr/apr/trunk/CHANGES (original)
+++ apr/apr/trunk/CHANGES Thu Aug 24 00:24:35 2006
@@ -1,5 +1,9 @@
 Changes for APR 1.3.0
 
+  *) Implement apr_threadkey_private destructors on WIN32
+     instead silently ignoring them, so that they behave like on
+     the pthreads powered platforms. [Mladen Turk]
+
   *) Support MinGW.  [John Vandenberg, Justin Erenkrantz]
 
   *) Implement apr_thread_yield on Unix in terms of pthread_yield or

Modified: apr/apr/trunk/include/arch/win32/apr_arch_threadproc.h
URL: http://svn.apache.org/viewvc/apr/apr/trunk/include/arch/win32/apr_arch_threadproc.h?rev=434327&r1=434326&r2=434327&view=diff
==============================================================================
--- apr/apr/trunk/include/arch/win32/apr_arch_threadproc.h (original)
+++ apr/apr/trunk/include/arch/win32/apr_arch_threadproc.h Thu Aug 24 00:24:35 2006
@@ -17,6 +17,7 @@
 #include "apr_private.h"
 #include "apr_thread_proc.h"
 #include "apr_file_io.h"
+#include "apr_hash.h"
 
 #ifndef THREAD_PROC_H
 #define THREAD_PROC_H
@@ -67,6 +68,11 @@
 struct apr_thread_once_t {
     long value;
 };
+
+#if defined(APR_DECLARE_EXPORT)
+/* Provide to win32/start.c */
+extern apr_hash_t *apr_tls_threadkeys;
+#endif
 
 #endif  /* ! THREAD_PROC_H */
 

Modified: apr/apr/trunk/misc/win32/start.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/misc/win32/start.c?rev=434327&r1=434326&r2=434327&view=diff
==============================================================================
--- apr/apr/trunk/misc/win32/start.c (original)
+++ apr/apr/trunk/misc/win32/start.c Thu Aug 24 00:24:35 2006
@@ -18,11 +18,13 @@
 #include "apr_general.h"
 #include "apr_pools.h"
 #include "apr_signal.h"
+#include "apr_hash.h"
 #include "ShellAPI.h"
 
 #include "apr_arch_misc.h"       /* for WSAHighByte / WSALowByte */
 #include "wchar.h"
 #include "apr_arch_file_io.h"
+#include "apr_arch_threadproc.h"
 #include "assert.h"
 
 /* This symbol is _private_, although it must be exported.
@@ -187,6 +189,11 @@
 
     apr_pool_tag(pool, "apr_initialize");
 
+#if defined(APR_DECLARE_EXPORT)
+    /* Initialize threadpriv table */
+    apr_tls_threadkeys = apr_hash_make(pool);
+#endif
+
     iVersionRequested = MAKEWORD(WSAHighByte, WSALowByte);
     err = WSAStartup((WORD) iVersionRequested, &wsaData);
     if (err) {
@@ -203,12 +210,63 @@
     return APR_SUCCESS;
 }
 
+#if defined(APR_DECLARE_EXPORT)
+typedef (apr_thredkey_destfn_t)(void *data);
+
+static void threadkey_terminate()
+{
+    apr_hash_index_t *hi = apr_hash_first(NULL, apr_tls_threadkeys);
+
+    for (; hi != NULL; hi = apr_hash_next(hi)) {
+        LPDWORD key;
+        apr_hash_this(hi, &key, NULL, NULL);
+        TlsFree(*key);
+    }
+}
+
+static void threadkey_detach()
+{
+    apr_hash_index_t *hi = apr_hash_first(NULL, apr_tls_threadkeys);
+
+    for (; hi != NULL; hi = apr_hash_next(hi)) {
+        apr_thredkey_destfn_t *dest = NULL;
+        LPDWORD key;
+        void *data;
+        apr_hash_this(hi, &key, NULL, (void **)&dest);
+        data = TlsGetValue(*key);
+        (*dest)(data);
+    }
+}
+
+BOOL APIENTRY DllMain(HINSTANCE instance,
+                      DWORD  reason_for_call,
+                      LPVOID lpReserved)
+{
+    switch (reason_for_call) {
+        case DLL_PROCESS_ATTACH:
+        break;
+        case DLL_THREAD_ATTACH:
+        break;
+        case DLL_THREAD_DETACH:
+            threadkey_detach();
+        break;
+        case DLL_PROCESS_DETACH:
+        break;
+    }
+    return TRUE;
+}
+
+#endif /* APR_DECLARE_EXPORT */
+
 APR_DECLARE_NONSTD(void) apr_terminate(void)
 {
     initialized--;
     if (initialized) {
         return;
     }
+#if defined(APR_DECLARE_EXPORT)
+    threadkey_terminate();
+#endif
     apr_pool_terminate();
 
     WSACleanup();

Modified: apr/apr/trunk/threadproc/win32/threadpriv.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/threadproc/win32/threadpriv.c?rev=434327&r1=434326&r2=434327&view=diff
==============================================================================
--- apr/apr/trunk/threadproc/win32/threadpriv.c (original)
+++ apr/apr/trunk/threadproc/win32/threadpriv.c Thu Aug 24 00:24:35 2006
@@ -16,11 +16,16 @@
 
 #include "apr_arch_threadproc.h"
 #include "apr_thread_proc.h"
+#include "apr_hash.h"
 #include "apr_general.h"
 #include "apr_lib.h"
 #include "apr_errno.h"
 #include "apr_portable.h"
 
+#if defined(APR_DECLARE_EXPORT)
+apr_hash_t *apr_tls_threadkeys = NULL;
+#endif
+
 APR_DECLARE(apr_status_t) apr_threadkey_private_create(apr_threadkey_t **key,
                                                     void (*dest)(void *),
                                                     apr_pool_t *pool)
@@ -33,6 +38,10 @@
     (*key)->pool = pool;
 
     if (((*key)->key = TlsAlloc()) != 0xFFFFFFFF) {
+#if defined(APR_DECLARE_EXPORT)
+        apr_hash_set(apr_tls_threadkeys, &((*key)->key),
+                     sizeof(DWORD), dest);
+#endif
         return APR_SUCCESS;
     }
     return apr_get_os_error();
@@ -59,7 +68,11 @@
 APR_DECLARE(apr_status_t) apr_threadkey_private_delete(apr_threadkey_t *key)
 {
     if (TlsFree(key->key)) {
-        return APR_SUCCESS; 
+#if defined(APR_DECLARE_EXPORT)
+        apr_hash_set(apr_tls_threadkeys, &(key->key),
+                     sizeof(DWORD), NULL);
+#endif
+        return APR_SUCCESS;
     }
     return apr_get_os_error();
 }
@@ -97,5 +110,5 @@
     }
     (*key)->key = *thekey;
     return APR_SUCCESS;
-}           
+}
 



Mime
View raw message