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;