You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by wr...@apache.org on 2003/03/27 20:51:12 UTC

cvs commit: apr/locks/win32 proc_mutex.c

wrowe       2003/03/27 11:51:12

  Modified:    locks/win32 proc_mutex.c
  Log:
    Win32 needs to do nothing if the file handle is already open in a child
    process, and we are using anonymous proc_mutex or global_mutex methods,
    so win32 should return APR_SUCCESS for proc_mutex_child_init.
  
    We also introduced the kernel 'object' 
folding function for shared memory
    section names, so reuse that folding function here to provide reliable
    Win2K/XP names (prefixed with \global\) and fold away any slashes or
    backslashes from that path.
  
    Based on issues observed by "Andre Schild" <A....@aarboard.ch> with
    the httpd mod_ssl implementation for Win32, with input from Andre and
    JimJ.
  
  Revision  Changes    Path
  1.13      +51 -18    apr/locks/win32/proc_mutex.c
  
  Index: proc_mutex.c
  ===================================================================
  RCS file: /home/cvs/apr/locks/win32/proc_mutex.c,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- proc_mutex.c	6 Jan 2003 23:44:31 -0000	1.12
  +++ proc_mutex.c	27 Mar 2003 19:51:12 -0000	1.13
  @@ -57,6 +57,7 @@
   #include "apr_general.h"
   #include "apr_strings.h"
   #include "apr_portable.h"
  +#include "apr_arch_file_io.h"
   #include "apr_arch_proc_mutex.h"
   #include "apr_arch_misc.h"
   
  @@ -64,8 +65,10 @@
   {
       apr_proc_mutex_t *mutex = mutex_;
   
  -    if (CloseHandle(mutex->handle) == 0) {
  -        return apr_get_os_error();
  +    if (mutex->handle) {
  +        if (CloseHandle(mutex->handle) == 0) {
  +            return apr_get_os_error();
  +        }
       }
       return APR_SUCCESS;
   }
  @@ -76,21 +79,32 @@
                                                   apr_pool_t *pool)
   {
       HANDLE hMutex;
  +    void *mutexkey;
   
  -    /* With Win2000 Terminal Services, the Mutex name can have a 
  -     * "Global\" or "Local\" prefix to explicitly create the object 
  -     * in the global or session name space.  Without Terminal Service
  -     * running on Win2000, Global\ and Local\ are ignored.  These
  -     * prefixes are only valid on Win2000+
  +    /* res_name_from_filename turns fname into a pseduo-name
  +     * without slashes or backslashes, and prepends the \global
  +     * prefix on Win2K and later
        */
       if (fname) {
  -        if (apr_os_level >= APR_WIN_2000)
  -            fname = apr_pstrcat(pool, "Global\\", fname, NULL);
  -        else
  -            fname = apr_pstrdup(pool, fname);
  +        mutexkey = res_name_from_filename(fname, 1, pool);
  +    }
  +    else {
  +        mutexkey = NULL;
  +    }
  +
  +#if APR_HAS_UNICODE_FS
  +    IF_WIN_OS_IS_UNICODE
  +    {
  +        hMutex = CreateMutexW(NULL, FALSE, mutexkey);
  +    }
  +#endif
  +#if APR_HAS_ANSI_FS
  +    ELSE_WIN_OS_IS_ANSI
  +    {
  +        hMutex = CreateMutexA(NULL, FALSE, mutexkey);
       }
  +#endif
   
  -    hMutex = CreateMutex(NULL, FALSE, fname);
       if (!hMutex) {
   	return apr_get_os_error();
       }
  @@ -109,13 +123,32 @@
                                                       apr_pool_t *pool)
   {
       HANDLE hMutex;
  +    void *mutexkey;
   
  -    if (apr_os_level >= APR_WIN_2000)
  -        fname = apr_pstrcat(pool, "Global\\", fname, NULL);
  -    else
  -        fname = apr_pstrdup(pool, fname);
  +    if (!fname) {
  +        /* Reinitializing unnamed mutexes is a noop in the Unix code. */
  +        return APR_SUCCESS;
  +    }
  +
  +    /* res_name_from_filename turns file into a pseudo-name
  +     * without slashes or backslashes, and prepends the \global
  +     * prefix on Win2K and later
  +     */
  +    mutexkey = res_name_from_filename(fname, 1, pool);
  +
  +#if APR_HAS_UNICODE_FS
  +    IF_WIN_OS_IS_UNICODE
  +    {
  +        hMutex = OpenMutexW(MUTEX_ALL_ACCESS, FALSE, mutexkey);
  +    }
  +#endif
  +#if APR_HAS_ANSI_FS
  +    ELSE_WIN_OS_IS_ANSI
  +    {
  +        hMutex = OpenMutexA(MUTEX_ALL_ACCESS, FALSE, mutexkey);
  +    }
  +#endif
   
  -    hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, fname);
       if (!hMutex) {
   	return apr_get_os_error();
       }
  @@ -174,7 +207,7 @@
   
   APR_DECLARE(const char *) apr_proc_mutex_name(apr_proc_mutex_t *mutex)
   {
  -    return "win32mutex";
  +    return mutex->fname;
   }
   
   APR_DECLARE(const char *) apr_proc_mutex_defname(void)