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 2002/01/08 06:58:38 UTC

cvs commit: apr/locks/win32 proc_mutex.c thread_mutex.c

wrowe       02/01/07 21:58:38

  Modified:    locks/win32 proc_mutex.c thread_mutex.c
  Log:
    Fix thread_mutex trylock for Win9x (returns APR_ENOTIMPL) and
    introduce proc_mutex for Win32.
  
  Revision  Changes    Path
  1.5       +96 -10    apr/locks/win32/proc_mutex.c
  
  Index: proc_mutex.c
  ===================================================================
  RCS file: /home/cvs/apr/locks/win32/proc_mutex.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- proc_mutex.c	29 Dec 2001 23:14:22 -0000	1.4
  +++ proc_mutex.c	8 Jan 2002 05:58:38 -0000	1.5
  @@ -56,42 +56,128 @@
   #include "apr_private.h"
   #include "apr_general.h"
   #include "apr_strings.h"
  -#include "win32/proc_mutex.h"
   #include "apr_portable.h"
  +#include "proc_mutex.h"
  +#include "misc.h"
  +
  +static apr_status_t proc_mutex_cleanup(void *mutex_)
  +{
  +    apr_proc_mutex_t *mutex = mutex_;
  +
  +    if (CloseHandle(mutex->handle) == 0) {
  +        return apr_get_os_error();
  +    }
  +    return APR_SUCCESS;
  +}
   
   APR_DECLARE(apr_status_t) apr_proc_mutex_create(apr_proc_mutex_t **mutex,
                                                   const char *fname,
                                                   apr_lockmech_e mech,
                                                   apr_pool_t *pool)
   {
  -    return APR_ENOTIMPL;
  +    HANDLE hMutex;
  +    SECURITY_ATTRIBUTES sec;
  +    sec.nLength = sizeof(SECURITY_ATTRIBUTES);
  +    sec.lpSecurityDescriptor = NULL;
  +    sec.bInheritHandle = TRUE;
  +
  +    /* 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+
  +     */
  +    if (apr_os_level >= APR_WIN_2000)
  +        fname = apr_pstrcat(pool, "Global\\", fname, NULL);
  +    else
  +        fname = apr_pstrdup(pool, fname);
  +
  +    hMutex = CreateMutex(&sec, FALSE, fname);
  +    if (!hMutex) {
  +	return apr_get_os_error();
  +    }
  +
  +    *mutex = (apr_proc_mutex_t *)apr_palloc(pool, sizeof(apr_proc_mutex_t));
  +    (*mutex)->pool = pool;
  +    (*mutex)->handle = hMutex;
  +    (*mutex)->fname = fname;
  +    apr_pool_cleanup_register((*mutex)->pool, *mutex, 
  +                              proc_mutex_cleanup, apr_pool_cleanup_null);
  +    return APR_SUCCESS;
   }
   
   APR_DECLARE(apr_status_t) apr_proc_mutex_child_init(apr_proc_mutex_t **mutex,
                                                       const char *fname,
                                                       apr_pool_t *pool)
   {
  -    return APR_ENOTIMPL;
  +    HANDLE hMutex;
  +
  +    if (apr_os_level >= APR_WIN_2000)
  +        fname = apr_pstrcat(pool, "Global\\", fname, NULL);
  +    else
  +        fname = apr_pstrdup(pool, fname);
  +
  +    hMutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, fname);
  +    if (!hMutex) {
  +	return apr_get_os_error();
  +    }
  +
  +    *mutex = (apr_proc_mutex_t *)apr_palloc(pool, sizeof(apr_proc_mutex_t));
  +    (*mutex)->pool = pool;
  +    (*mutex)->handle = hMutex;
  +    (*mutex)->fname = fname;
  +    apr_pool_cleanup_register((*mutex)->pool, *mutex, 
  +                              proc_mutex_cleanup, apr_pool_cleanup_null);
  +    return APR_SUCCESS;
   }
       
   APR_DECLARE(apr_status_t) apr_proc_mutex_lock(apr_proc_mutex_t *mutex)
   {
  -    return APR_ENOTIMPL;
  +    DWORD rv;
  +
  +    rv = WaitForSingleObject(mutex->handle, INFINITE);
  +
  +    if (rv == WAIT_OBJECT_0) {
  +        return APR_SUCCESS;
  +    }
  +    else if (rv == WAIT_ABANDONED) {
  +        return APR_EBUSY;
  +    }
  +    return apr_get_os_error();
   }
   
   APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex)
   {
  -    return APR_ENOTIMPL;
  +    DWORD rv;
  +
  +    rv = WaitForSingleObject(mutex->handle, 0);
  +
  +    if (rv == WAIT_OBJECT_0) {
  +        return APR_SUCCESS;
  +    }
  +    else if (rv == WAIT_ABANDONED) {
  +        return APR_EBUSY;
  +    }
  +    return apr_get_os_error();
   }
   
   APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex)
   {
  -    return APR_ENOTIMPL;
  +    if (ReleaseMutex(mutex->handle) == 0) {
  +        return apr_get_os_error();
  +    }
  +    return APR_SUCCESS;
   }
   
   APR_DECLARE(apr_status_t) apr_proc_mutex_destroy(apr_proc_mutex_t *mutex)
   {
  -    return APR_ENOTIMPL;
  +    apr_status_t stat;
  +
  +    stat = proc_mutex_cleanup(mutex);
  +    if (stat == APR_SUCCESS) {
  +        apr_pool_cleanup_kill(mutex->pool, mutex, proc_mutex_cleanup);
  +    }
  +    return stat;
   }
   
   APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex)
  @@ -99,9 +185,9 @@
   /* Implement OS-specific accessors defined in apr_portable.h */
   
   APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex,
  -                                                apr_proc_mutex_t *lock)
  +                                                apr_proc_mutex_t *mutex)
   {
  -    *ospmutex = pmutex->mutex;
  +    *ospmutex = mutex->handle;
       return APR_SUCCESS;
   }
   
  @@ -117,7 +203,7 @@
                                                      sizeof(apr_proc_mutex_t));
           (*pmutex)->pool = pool;
       }
  -    (*pmutex)->mutex = *ospmutex;
  +    (*pmutex)->handle = *ospmutex;
       return APR_SUCCESS;
   }
   
  
  
  
  1.8       +5 -4      apr/locks/win32/thread_mutex.c
  
  Index: thread_mutex.c
  ===================================================================
  RCS file: /home/cvs/apr/locks/win32/thread_mutex.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- thread_mutex.c	27 Nov 2001 03:20:39 -0000	1.7
  +++ thread_mutex.c	8 Jan 2002 05:58:38 -0000	1.8
  @@ -59,6 +59,7 @@
   #include "thread_mutex.h"
   #include "apr_thread_mutex.h"
   #include "apr_portable.h"
  +#include "misc.h"
   
   static apr_status_t thread_mutex_cleanup(void *data)
   {
  @@ -91,10 +92,10 @@
   
   APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex)
   {
  -    BOOL status;
  -    /* XXX TryEnterCriticalSection is not available under Win9x */
  -    status = TryEnterCriticalSection(&mutex->section);
  -    if (status) {
  +    if (apr_os_level < APR_WIN_NT) {
  +        return APR_ENOTIMPL;
  +    }
  +    if (TryEnterCriticalSection(&mutex->section)) {
           return APR_SUCCESS;
       }
       return APR_EBUSY;