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);
   }
   
  
  
  

Reply via email to