manoj 99/04/13 23:26:12
Modified: pthreads/src/main acceptlock.c Log: Make USE_PTHREAD_SERIALIZED_ACCEPT functional. A few bugs are fixed, and mmap usage is optimized (I hope). Revision Changes Path 1.4 +48 -44 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.3 retrieving revision 1.4 diff -u -u -r1.3 -r1.4 --- acceptlock.c 1999/04/09 03:15:40 1.3 +++ acceptlock.c 1999/04/14 06:26:12 1.4 @@ -170,7 +170,7 @@ #include <pthread.h> -static pthread_mutex_t **accept_mutex = (void *)(caddr_t) -1; +static pthread_mutex_t *accept_mutex = (void *)(caddr_t) -1; static int *have_accept_mutex; static sigset_t accept_block_mask; static sigset_t accept_previous_mask; @@ -179,10 +179,11 @@ { int i; - for (i = 0; i < ap_acceptors_per_child; i++) { - if (accept_mutex[i] != (void *)(caddr_t)-1 - && have_accept_mutex[i]) { - pthread_mutex_unlock(accept_mutex[i]); + if (accept_mutex != (void *)(caddr_t)-1) { + for (i = 0; i < ap_acceptors_per_child; i++) { + if (have_accept_mutex[i]) { + pthread_mutex_unlock(&accept_mutex[i]); + } } } } @@ -195,13 +196,12 @@ { int i; - for (i = 0; i < ap_acceptors_per_child; i++) { - if (accept_mutex[i] != (void *)(caddr_t)-1 - && munmap((caddr_t) accept_mutex[i], sizeof(pthread_mutex_t))) { - perror("munmap"); - } - accept_mutex[i] = (void *)(caddr_t)-1; + if (accept_mutex != (void *)(caddr_t)-1 + && munmap((caddr_t) accept_mutex, + sizeof(pthread_mutex_t) * ap_acceptors_per_child)) { + perror("munmap"); } + accept_mutex = (void *)(caddr_t)-1; } void accept_mutex_init(pool *p) @@ -210,56 +210,60 @@ int fd; int i; - accept_mutex = (pthread_mutex_t *)ap_palloc(p, - ap_acceptors_per_child * sizeof(pthread_mutex_t *)); have_accept_mutex = (int *)ap_palloc(p, ap_acceptors_per_child * sizeof(int)); - + fd = open("/dev/zero", O_RDWR); + if (fd == -1) { + perror("open(/dev/zero)"); + exit(APEXIT_INIT); + } + accept_mutex = (pthread_mutex_t *) mmap((caddr_t) 0, + sizeof(pthread_mutex_t) * ap_acceptors_per_child, + PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (accept_mutex == (void *) (caddr_t) - 1) { + perror("mmap"); + exit(APEXIT_INIT); + } + close(fd); + if ((errno = pthread_mutexattr_init(&mattr))) { + perror("pthread_mutexattr_init"); + exit(APEXIT_INIT); + } + if ((errno = pthread_mutexattr_setpshared(&mattr, + PTHREAD_PROCESS_SHARED))) { + perror("pthread_mutexattr_setpshared"); + exit(APEXIT_INIT); + } for (i = 0; i < ap_acceptors_per_child; i++) { - fd = open("/dev/zero", O_RDWR); - if (fd == -1) { - perror("open(/dev/zero)"); - exit(APEXIT_INIT); - } - accept_mutex[i] = (pthread_mutex_t *) mmap((caddr_t) 0, - sizeof(*accept_mutex), - PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (accept_mutex[i] == (void *) (caddr_t) - 1) { - perror("mmap"); - exit(APEXIT_INIT); - } - close(fd); - if ((errno = pthread_mutexattr_init(&mattr))) { - perror("pthread_mutexattr_init"); - exit(APEXIT_INIT); - } - if ((errno = pthread_mutexattr_setpshared(&mattr, - PTHREAD_PROCESS_SHARED))) { - perror("pthread_mutexattr_setpshared"); - exit(APEXIT_INIT); - } - if ((errno = pthread_mutex_init(accept_mutex, &mattr))) { + if ((errno = pthread_mutex_init(&accept_mutex[i], &mattr))) { perror("pthread_mutex_init"); exit(APEXIT_INIT); } - sigfillset(&accept_block_mask); - sigdelset(&accept_block_mask, SIGHUP); - sigdelset(&accept_block_mask, SIGTERM); - sigdelset(&accept_block_mask, SIGWINCH); - ap_register_cleanup(p, NULL, accept_mutex_cleanup, ap_null_cleanup); } + if ((errno = pthread_mutexattr_destroy(&mattr))) { + perror("pthread_mutexattr_destroy"); + exit(APEXIT_INIT); + } + sigfillset(&accept_block_mask); + sigdelset(&accept_block_mask, SIGHUP); + sigdelset(&accept_block_mask, SIGTERM); + sigdelset(&accept_block_mask, SIGWINCH); + ap_register_cleanup(p, NULL, accept_mutex_cleanup, ap_null_cleanup); } void accept_mutex_on(int locknum) { int err; + /* Already blocking out all signals in worker threads. */ +#if 0 if (sigprocmask(SIG_BLOCK, &accept_block_mask, &accept_previous_mask)) { perror("sigprocmask(SIG_BLOCK)"); clean_child_exit(APEXIT_CHILDFATAL); } - if ((err = pthread_mutex_lock(accept_mutex[locknum]))) { +#endif + if ((err = pthread_mutex_lock(&accept_mutex[locknum]))) { errno = err; perror("pthread_mutex_lock"); clean_child_exit(APEXIT_CHILDFATAL); @@ -271,7 +275,7 @@ { int err; - if ((err = pthread_mutex_unlock(accept_mutex[locknum]))) { + if ((err = pthread_mutex_unlock(&accept_mutex[locknum]))) { errno = err; perror("pthread_mutex_unlock"); clean_child_exit(APEXIT_CHILDFATAL);