dgaudet 97/11/04 00:33:13
Modified: src/test time-sem.c Log: latest greatest time-sem.c Revision Changes Path 1.3 +64 -15 apachen/src/test/time-sem.c Index: time-sem.c =================================================================== RCS file: /export/home/cvs/apachen/src/test/time-sem.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- time-sem.c 1997/11/04 07:57:43 1.2 +++ time-sem.c 1997/11/04 08:33:13 1.3 @@ -1,23 +1,38 @@ /* -Date: Sat, 1 Nov 1997 16:53:52 -0800 (PST) -From: Dean Gaudet <[EMAIL PROTECTED]> +time-sem.c has the basics of the semaphores we use in http_main.c. It's +intended for timing differences between various methods on an +architecture. In practice we've found many things affect which semaphore +to be used: + + - NFS filesystems absolutely suck for fcntl() and flock() + + - uslock absolutely sucks on single-processor IRIX boxes, but + absolutely rocks on multi-processor boxes. The converse + is true for fcntl. sysvsem seems a moderate balance. + + - Under Solaris you can't have too many processes use SEM_UNDO, there + might be a tuneable somewhere that increases the limit from 29. + We're not sure what the tunable is, so there's a define + NO_SEM_UNDO which can be used to simulate us trapping/blocking + signals to be able to properly release the semaphore on a clean + child death. + +argv[1] is the #children, argv[2] is the #iterations per child + +You should run each over many different #children inputs, and choose +#iter such that the program runs for at least a second or so... or even +longer depending on your patience. -This time-sem.c includes the necessary signal manipulations to allow us to -continue to use pthreads. It appears to still be and order of magnitude -faster than fcntl locking. I'm a little too busy to make a patch though, -so if someone could take the pthread code in time-sem.c here and compare -it against the server ... and generate a patch, that'd be great. You also -have to properly release the mutex on any of the three unblocked signals -- -which you should do in the handlers we already have for those signals, -so that we don't have to also instate a handler during the critical -section ... - -Dean +compile with: gcc -o time-FCNTL -Wall -O time-sem.c -DUSE_FCNTL_SERIALIZED_ACCEPT gcc -o time-FLOCK -Wall -O time-sem.c -DUSE_FLOCK_SERIALIZED_ACCEPT -gcc -o time-SEM -Wall -O time-sem.c -DUSE_SYSVSEM_SERIALIZED_ACCEPT +gcc -o time-SYSVSEM -Wall -O time-sem.c -DUSE_SYSVSEM_SERIALIZED_ACCEPT +gcc -o time-SYSVSEM2 -Wall -O time-sem.c -DUSE_SYSVSEM_SERIALIZED_ACCEPT -DNO_SEM_UNDO gcc -o time-PTHREAD -Wall -O time-sem.c -DUSE_PTHREAD_SERIALIZED_ACCEPT -lpthread +gcc -o time-USLOCK -Wall -O time-sem.c -DUSE_USLOCK_SERIALIZED_ACCEPT + +not all versions work on all systems. */ #include <errno.h> @@ -146,6 +161,10 @@ #include <sys/sem.h> static int sem_id = -1; +#ifdef NO_SEM_UNDO +static sigset_t accept_block_mask; +static sigset_t accept_previous_mask; +#endif void accept_mutex_init(void) { @@ -167,15 +186,29 @@ perror ("semctl"); exit(1); } +#ifdef NO_SEM_UNDO + sigfillset(&accept_block_mask); + sigdelset(&accept_block_mask, SIGHUP); + sigdelset(&accept_block_mask, SIGTERM); + sigdelset(&accept_block_mask, SIGUSR1); +#endif } void accept_mutex_on() { struct sembuf op; +#ifdef NO_SEM_UNDO + if (sigprocmask(SIG_BLOCK, &accept_block_mask, &accept_previous_mask)) { + perror("sigprocmask(SIG_BLOCK)"); + exit (1); + } + op.sem_flg = 0; +#else + op.sem_flg = SEM_UNDO; +#endif op.sem_num = 0; op.sem_op = -1; - op.sem_flg = SEM_UNDO; if (semop(sem_id, &op, 1) < 0) { perror ("accept_mutex_on"); exit (1); @@ -188,15 +221,30 @@ op.sem_num = 0; op.sem_op = 1; +#ifdef NO_SEM_UNDO + op.sem_flg = 0; +#else op.sem_flg = SEM_UNDO; +#endif if (semop(sem_id, &op, 1) < 0) { perror ("accept_mutex_off"); exit (1); } +#ifdef NO_SEM_UNDO + if (sigprocmask(SIG_SETMASK, &accept_previous_mask, NULL)) { + perror("sigprocmask(SIG_SETMASK)"); + exit (1); + } +#endif } #elif defined (USE_PTHREAD_SERIALIZED_ACCEPT) +/* note: pthread mutexes aren't released on child death, hence the + * signal goop ... in a real implementation we'd do special things + * during hup, term, usr1. + */ + #include <pthread.h> static pthread_mutex_t *mutex; @@ -403,5 +451,6 @@ } last.tv_usec = ms; printf ("%8lu.%06lu\n", last.tv_sec, last.tv_usec); + exit(0); }