manoj 99/04/16 20:35:55
Modified: pthreads/src/include acceptlock.h http_accept.h pthreads/src/main Makefile.tmpl acceptlock.c Log: Add intraprocess support to the accept mutexes. This is needed by the USE_MULTI_ACCEPT model since threads within a process can compete with each other for the lock. Revision Changes Path 1.4 +2 -1 apache-apr/pthreads/src/include/acceptlock.h Index: acceptlock.h =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/include/acceptlock.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -u -r1.3 -r1.4 --- acceptlock.h 1999/04/14 22:44:55 1.3 +++ acceptlock.h 1999/04/17 03:35:53 1.4 @@ -79,12 +79,13 @@ #elif defined (USE_SYSVSEM_SERIALIZED_ACCEPT) void accept_mutex_cleanup(void *); +void accept_mutex_child_init(pool *); void accept_mutex_init(pool *, int); void accept_mutex_on(int); void accept_mutex_off(int); #elif defined(USE_FCNTL_SERIALIZED_ACCEPT) -#define accept_mutex_child_init(x) +void accept_mutex_child_init(pool *); void accept_mutex_init(pool *, int); void accept_mutex_on(int); void accept_mutex_off(int); 1.5 +4 -0 apache-apr/pthreads/src/include/http_accept.h Index: http_accept.h =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/include/http_accept.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -u -r1.4 -r1.5 --- http_accept.h 1999/04/14 22:44:55 1.4 +++ http_accept.h 1999/04/17 03:35:53 1.5 @@ -85,6 +85,10 @@ int get_connection(struct sockaddr *); void stop_accepting_connections(pool*); +#ifdef USE_MULTI_ACCEPT +#define NEED_INTRAPROCESS_SERIALIZED_ACCEPT +#endif + #ifdef __cplusplus } #endif 1.8 +2 -1 apache-apr/pthreads/src/main/Makefile.tmpl Index: Makefile.tmpl =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/main/Makefile.tmpl,v retrieving revision 1.7 retrieving revision 1.8 diff -u -u -r1.7 -r1.8 --- Makefile.tmpl 1999/04/07 22:52:17 1.7 +++ Makefile.tmpl 1999/04/17 03:35:54 1.8 @@ -66,7 +66,8 @@ $(INCDIR)/http_config.h $(INCDIR)/http_protocol.h \ $(INCDIR)/http_request.h $(INCDIR)/http_conf_globals.h \ $(INCDIR)/http_core.h $(INCDIR)/http_vhost.h \ - $(INCDIR)/util_script.h $(INCDIR)/fdqueue.h $(INCDIR)/acceptlock.h + $(INCDIR)/util_script.h $(INCDIR)/fdqueue.h $(INCDIR)/acceptlock.h \ + $(INCDIR)/http_accept.h alloc.o: alloc.c $(INCDIR)/httpd.h $(INCDIR)/ap_config.h \ $(INCDIR)/ap_mmn.h $(INCDIR)/ap_config_auto.h $(OSDIR)/os.h \ $(OSDIR)/os-inline.c $(INCDIR)/ap_ctype.h $(INCDIR)/hsregex.h \ 1.7 +69 -2 apache-apr/pthreads/src/main/acceptlock.c Index: acceptlock.c =================================================================== RCS file: /home/cvs/apache-apr/pthreads/src/main/acceptlock.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -u -r1.6 -r1.7 --- acceptlock.c 1999/04/16 04:43:01 1.6 +++ acceptlock.c 1999/04/17 03:35:54 1.7 @@ -68,6 +68,7 @@ #include "util_uri.h" #include "fdqueue.h" #include "acceptlock.h" +#include "http_accept.h" #include <netinet/tcp.h> #include <stdio.h> @@ -82,6 +83,56 @@ /* Number of cross-process locks we're managing */ static int lock_count; +/* Intraprocess locking used by other serialization techniques */ +#ifdef NEED_INTRAPROCESS_SERIALIZED_ACCEPT +static pthread_mutex_t *intra_mutex = NULL; + +static void intra_mutex_cleanup(void *foo) +{ + int i; + + for (i = 0; i < lock_count; i++) { + (void) pthread_mutex_destroy(&intra_mutex[i]); + } +} + +static void intra_mutex_init(pool *p) +{ + int i; + + intra_mutex = (pthread_mutex_t *)ap_palloc(p, lock_count * sizeof(pthread_mutex_t )); + for (i = 0; i < lock_count; i++) { + if (pthread_mutex_init(&intra_mutex[i], NULL) != 0) { + perror("intra_mutex_init"); + clean_child_exit(APEXIT_CHILDFATAL); + } + } + ap_register_cleanup(p, NULL, intra_mutex_cleanup, ap_null_cleanup); +} + +static void intra_mutex_on(int locknum) +{ + if ((errno = pthread_mutex_lock(&intra_mutex[locknum])) != 0) { + ap_log_error(APLOG_MARK, APLOG_EMERG, + (const server_rec *) ap_get_server_conf(), + "Error getting intraprocess lock. Exiting!"); + } +} + +static void intra_mutex_off(int locknum) +{ + if (pthread_mutex_unlock(&intra_mutex[locknum]) != 0) { + ap_log_error(APLOG_MARK, APLOG_EMERG, + (const server_rec *) ap_get_server_conf(), + "Error releasing intraprocess lock. Exiting!"); + } +} +#else /* NEED_INTRAPROCESS_SERIALIZED_ACCEPT */ +#define intra_mutex_init(x) +#define intra_mutex_on(x) +#define intra_mutex_off(x) +#endif /* NEED_INTRAPROCESS_SERIALIZED_ACCEPT */ + #if defined(USE_FCNTL_SERIALIZED_ACCEPT) || defined(USE_FLOCK_SERIALIZED_ACCEPT) static void init_lock_fname(pool *p) { @@ -97,6 +148,7 @@ #endif #if defined (USE_USLOCK_SERIALIZED_ACCEPT) +/* XXX - Don't know if we need the intraprocess locks here */ #include <ulocks.h> @@ -402,8 +454,14 @@ } } +void accept_mutex_child_init(pool *p) +{ + intra_mutex_init(p); +} + void accept_mutex_on(int locknum) { + intra_mutex_on(locknum); if (semop(sem_id[locknum], &op_on, 1) < 0) { perror("accept_mutex_on"); clean_child_exit(APEXIT_CHILDFATAL); @@ -416,6 +474,7 @@ perror("accept_mutex_off"); clean_child_exit(APEXIT_CHILDFATAL); } + intra_mutex_off(locknum); } #elif defined(USE_FCNTL_SERIALIZED_ACCEPT) @@ -424,8 +483,6 @@ static int *lock_fd = NULL; - - /* * Initialize mutex lock. * Must be safe to call this on a restart. @@ -462,10 +519,16 @@ } } +void accept_mutex_child_init(pool *p) +{ + intra_mutex_init(p); +} + void accept_mutex_on(int locknum) { int ret; + intra_mutex_on(locknum); while ((ret = fcntl(lock_fd[locknum], F_SETLKW, &lock_it)) < 0 && errno != EINTR) { /* nop */ @@ -495,6 +558,7 @@ "your lock file on a local disk!"); clean_child_exit(APEXIT_CHILDFATAL); } + intra_mutex_off(locknum); } #elif defined(USE_FLOCK_SERIALIZED_ACCEPT) @@ -520,6 +584,7 @@ { int i; + intra_mutex_init(p); for (i = 0; i < lock_count; i++) { char *lock_fname = expand_lock_fname(p, i); @@ -564,6 +629,7 @@ { int ret; + intra_mutex_on(locknum); while ((ret = flock(lock_fd[locknum], LOCK_EX)) < 0 && errno != EINTR) continue; @@ -583,6 +649,7 @@ "flock: LOCK_UN: Error freeing accept lock. Exiting!"); clean_child_exit(APEXIT_CHILDFATAL); } + intra_mutex_off(locknum); } #elif defined(USE_OS2SEM_SERIALIZED_ACCEPT)