You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by gs...@locus.apache.org on 2000/07/01 15:58:56 UTC
cvs commit: apache-2.0/src/lib/sdbm sdbm_lock.c sdbm_tune.h sdbm.c
gstein 00/07/01 06:58:53
Modified: src/lib/sdbm sdbm_lock.c sdbm_tune.h sdbm.c
Log:
switch over to use APR locks (the old scheme relied on Apache 1.3 symbols
which no longer exist in 2.0). still not right (the lock is not
fine-grained enough), but it works.
Revision Changes Path
1.2 +25 -87 apache-2.0/src/lib/sdbm/sdbm_lock.c
Index: sdbm_lock.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/sdbm/sdbm_lock.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- sdbm_lock.c 2000/06/28 08:56:03 1.1
+++ sdbm_lock.c 2000/07/01 13:58:52 1.2
@@ -4,103 +4,41 @@
** Snarfed from mod_rewrite.c. Munged up for our use.
*/
-#include "ap_config.h"
+#include "apr_lock.h"
- /* The locking support:
- * Try to determine whether we should use fcntl() or flock().
- * Would be better ap_config.h could provide this... :-(
- */
-#if defined(USE_FCNTL_SERIALIZED_ACCEPT)
-#define USE_FCNTL 1
-#include <fcntl.h>
-#endif
-#if defined(USE_FLOCK_SERIALIZED_ACCEPT)
-#define USE_FLOCK 1
-#include <sys/file.h>
-#endif
-#if !defined(USE_FCNTL) && !defined(USE_FLOCK)
-#define USE_FLOCK 1
-#if !defined(MPE) && !defined(WIN32)
-#include <sys/file.h>
-#endif
-#ifndef LOCK_UN
-#undef USE_FLOCK
-#define USE_FCNTL 1
-#include <fcntl.h>
-#endif
-#endif
-#ifdef AIX
-#undef USE_FLOCK
-#define USE_FCNTL 1
-#include <fcntl.h>
-#endif
-#ifdef WIN32
-#undef USE_FCNTL
-#define USE_LOCKING
-#include <sys/locking.h>
-#endif
-
-
-#ifdef USE_FCNTL
-/* ugly interface requires this structure to be "live" for a while */
-static struct flock lock_it;
-static struct flock unlock_it;
-#endif
+static ap_lock_t *sdbm_lock_object = NULL;
+
+static ap_status_t create_lock()
+{
+ /* ### this should be specific to the file... */
+ return ap_create_lock(&sdbm_lock_object, APR_MUTEX, APR_LOCKALL,
+ NULL, NULL);
+}
+
/* NOTE: this function blocks until it acquires the lock */
-int sdbm_fd_lock(int fd, int readonly)
+ap_status_t sdbm_fd_lock(int fd, int readonly)
{
- int rc;
+ ap_status_t status;
-#ifdef USE_FCNTL
- lock_it.l_whence = SEEK_SET; /* from current point */
- lock_it.l_start = 0; /* -"- */
- lock_it.l_len = 0; /* until end of file */
- lock_it.l_type = readonly ? F_RDLCK : F_WRLCK; /* set lock type */
- lock_it.l_pid = 0; /* pid not actually interesting */
-
- while ( ((rc = fcntl(fd, F_SETLKW, &lock_it)) < 0)
- && (errno == EINTR) ) {
- continue;
- }
-#endif
-#ifdef USE_FLOCK
- while ( ((rc = flock(fd, readonly ? LOCK_SH : LOCK_EX)) < 0)
- && (errno == EINTR) ) {
- continue;
+ if (sdbm_lock_object == NULL) {
+ if ((status = create_lock()) != APR_SUCCESS) {
+ return status;
+ }
}
-#endif
-#ifdef USE_LOCKING
- /* ### this doesn't allow simultaneous reads! */
- /* ### this doesn't block forever */
- /* Lock the first byte */
- lseek(fd, 0, SEEK_SET);
- rc = _locking(fd, _LK_LOCK, 1);
-#endif
- return rc;
+ return ap_lock(sdbm_lock_object);
}
-int sdbm_fd_unlock(int fd)
+ap_status_t sdbm_fd_unlock(int fd)
{
- int rc;
+ ap_status_t status;
-#ifdef USE_FCNTL
- unlock_it.l_whence = SEEK_SET; /* from current point */
- unlock_it.l_start = 0; /* -"- */
- unlock_it.l_len = 0; /* until end of file */
- unlock_it.l_type = F_UNLCK; /* unlock */
- unlock_it.l_pid = 0; /* pid not actually interesting */
-
- rc = fcntl(fd, F_SETLKW, &unlock_it);
-#endif
-#ifdef USE_FLOCK
- rc = flock(fd, LOCK_UN);
-#endif
-#ifdef USE_LOCKING
- lseek(fd, 0, SEEK_SET);
- rc = _locking(fd, _LK_UNLCK, 1);
-#endif
+ if (sdbm_lock_object == NULL) {
+ if ((status = create_lock()) != APR_SUCCESS) {
+ return status;
+ }
+ }
- return rc;
+ return ap_unlock(sdbm_lock_object);
}
1.2 +4 -2 apache-2.0/src/lib/sdbm/sdbm_tune.h
Index: sdbm_tune.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/sdbm/sdbm_tune.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- sdbm_tune.h 2000/06/28 08:56:03 1.1
+++ sdbm_tune.h 2000/07/01 13:58:52 1.2
@@ -4,6 +4,8 @@
* author: oz@nexus.yorku.ca
*/
+#include "apr_errno.h"
+
#define BYTESIZ 8
/*
@@ -22,5 +24,5 @@
#define debug(x)
#endif
-int sdbm_fd_lock(int fd, int readonly);
-int sdbm_fd_unlock(int fd);
+ap_status_t sdbm_fd_lock(int fd, int readonly);
+ap_status_t sdbm_fd_unlock(int fd);
1.2 +1 -1 apache-2.0/src/lib/sdbm/sdbm.c
Index: sdbm.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/sdbm/sdbm.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- sdbm.c 2000/06/28 08:56:03 1.1
+++ sdbm.c 2000/07/01 13:58:52 1.2
@@ -124,7 +124,7 @@
flags |= O_BINARY;
#endif
if ((db->pagf = open(pagname, flags, mode)) > -1) {
- if ( sdbm_fd_lock(db->pagf, sdbm_rdonly(db)) > -1 ) {
+ if ( sdbm_fd_lock(db->pagf, sdbm_rdonly(db)) == APR_SUCCESS ) {
if ((db->dirf = open(dirname, flags, mode)) > -1) {
/*
* need the dirfile size to establish max bit number.