apr-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "William A. Rowe, Jr." <wr...@rowe-clan.net>
Subject Re: svn commit: r434327 - in /apr/apr/trunk: CHANGES include/arch/win32/apr_arch_threadproc.h misc/win32/start.c threadproc/win32/threadpriv.c
Date Sat, 26 Aug 2006 18:06:09 GMT
I thought the concensus was that the MSVC's own destructor callbacks
were more interesting, since they would permit apr to be statically
bound to the app?

On that note, doesn't this patch break if you statically link your
app to apr *and* provide your own DllMain?

It's great to continue to discuss this on trunk, but would you please
hold off any backporting till those questions are resolved?

mturk@apache.org wrote:
> 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