You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by st...@hyperreal.org on 1999/10/05 03:07:58 UTC
cvs commit: apache-2.0/src/lib/apr/locks/win32 locks.c locks.h
stoddard 99/10/04 18:07:57
Modified: src/lib/apr/locks/win32 locks.c locks.h
Log:
1. Add Win32 CriticalSections for intra-process locking
2. Another argument swap
Revision Changes Path
1.4 +50 -20 apache-2.0/src/lib/apr/locks/win32/locks.c
Index: locks.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/locks/win32/locks.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- locks.c 1999/10/04 16:36:59 1.3
+++ locks.c 1999/10/05 01:07:55 1.4
@@ -68,32 +68,49 @@
newlock = (struct lock_t *)ap_palloc(cont, sizeof(struct lock_t));
newlock->cntxt = cont;
- newlock->fname = strdup(fname);
-
+ /* ToDo: How to handle the case when no context is available?
+ * How to cleanup the storage properly?
+ */
+ if (cont)
+ newlock->fname = ap_pstrdup(cont, fname);
+ else
+ newlock->fname = strdup(fname);
+ newlock->type = type;
+ newlock->scope = scope;
sec.nLength = sizeof(SECURITY_ATTRIBUTES);
sec.lpSecurityDescriptor = NULL;
- if (type == APR_CROSS_PROCESS || type == APR_LOCKALL) {
+ if (scope == APR_CROSS_PROCESS || scope == APR_LOCKALL) {
sec.bInheritHandle = TRUE;
}
else {
sec.bInheritHandle = FALSE;
}
- newlock->mutex = CreateMutex(&sec, FALSE, fname);
+ if (type == APR_INTRAPROCESS) {
+ InitializeCriticalSection(&newlock->section);
+ } else {
+ newlock->mutex = CreateMutex(&sec, FALSE, fname);
+ }
*lock = newlock;
return APR_SUCCESS;
}
ap_status_t ap_child_init_lock(struct lock_t **lock, ap_context_t *cont, char *fname)
{
+ /* This routine should not be called (and OpenMutex will fail if called)
+ * on a INTRAPROCESS lock
+ */
(*lock) = (struct lock_t *)ap_palloc(cont, sizeof(struct lock_t));
if ((*lock) == NULL) {
return APR_ENOMEM;
}
+ if (cont)
+ (*lock)->fname = ap_pstrdup(cont, fname);
+ else
+ (*lock)->fname = strdup(fname);
- (*lock)->fname = strdup(fname);
(*lock)->mutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, fname);
if ((*lock)->mutex == NULL) {
@@ -105,31 +122,44 @@
ap_status_t ap_lock(struct lock_t *lock)
{
DWORD rv;
-
- rv = WaitForSingleObject(lock->mutex, INFINITE);
-
- if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) {
+ if (lock->type == APR_INTRAPROCESS) {
+ EnterCriticalSection(&lock->section);
return APR_SUCCESS;
- }
- if (rv == WAIT_TIMEOUT) {
- return APR_TIMEUP;
- }
+ } else {
+ rv = WaitForSingleObject(lock->mutex, INFINITE);
+ if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) {
+ return APR_SUCCESS;
+ }
+ if (rv == WAIT_TIMEOUT) {
+ return APR_TIMEUP;
+ }
+ }
return APR_EEXIST;
}
ap_status_t ap_unlock(struct lock_t *lock)
{
- if (ReleaseMutex(lock->mutex) == 0) {
- return APR_EEXIST;
+ if (lock->type == APR_INTRAPROCESS) {
+ LeaveCriticalSection(&lock->section);
+ return APR_SUCCESS;
+ } else {
+ if (ReleaseMutex(lock->mutex) == 0) {
+ return APR_EEXIST;
+ }
}
return APR_SUCCESS;
}
ap_status_t ap_destroy_lock(struct lock_t *lock)
{
- if (CloseHandle(lock->mutex) == 0) {
- return APR_EEXIST;
+ if (lock->type == APR_INTRAPROCESS) {
+ DeleteCriticalSection(&lock->section);
+ return APR_SUCCESS;
+ } else {
+ if (CloseHandle(lock->mutex) == 0) {
+ return APR_EEXIST;
+ }
}
return APR_SUCCESS;
}
@@ -137,7 +167,7 @@
ap_status_t ap_get_lockdata(struct lock_t *lock, char *key, void *data)
{
if (lock != NULL) {
- return ap_get_userdata(lock->cntxt, key, &data);
+ return ap_get_userdata(&data, lock->cntxt, key);
}
else {
data = NULL;
@@ -166,8 +196,8 @@
return APR_SUCCESS;
}
-ap_status_t ap_put_os_lock(ap_context_t *cont, struct lock_t **lock,
- ap_os_lock_t *thelock)
+ap_status_t ap_put_os_lock(struct lock_t **lock, ap_os_lock_t *thelock,
+ ap_context_t *cont)
{
if (cont == NULL) {
return APR_ENOCONT;
1.2 +3 -0 apache-2.0/src/lib/apr/locks/win32/locks.h
Index: locks.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/locks/win32/locks.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- locks.h 1999/08/17 15:59:42 1.1
+++ locks.h 1999/10/05 01:07:56 1.2
@@ -59,7 +59,10 @@
struct lock_t {
ap_context_t *cntxt;
+ ap_locktype_e type;
+ ap_lockscope_e scope;
HANDLE mutex;
+ CRITICAL_SECTION section;
char *fname;
};