You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Dean Gaudet <dg...@hyperreal.com> on 1997/06/30 23:18:13 UTC

cvs commit: apache/src CHANGES http_config.c

dgaudet     97/06/30 14:18:13

  Modified:    src       CHANGES http_config.c
  Log:
  run_method optimized to avoid needless scanning over NULLs in the module list
  
  Revision  Changes    Path
  1.314     +4 -1      apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.313
  retrieving revision 1.314
  diff -C3 -r1.313 -r1.314
  *** CHANGES	1997/06/30 21:09:56	1.313
  --- CHANGES	1997/06/30 21:18:10	1.314
  ***************
  *** 1,5 ****
    Changes with Apache 1.3
  ! 
      *) Revamp of (unix) scoreboard management code such that it avoids
         unnecessary traversals of the scoreboard on each hit.  This is
         particularly important for high volume sites with a large
  --- 1,8 ----
    Changes with Apache 1.3
  !   
  !   *) run_method optimized to avoid needless scanning over NULLs in the
  !      module list.  [Dean Gaudet]
  !   
      *) Revamp of (unix) scoreboard management code such that it avoids
         unnecessary traversals of the scoreboard on each hit.  This is
         particularly important for high volume sites with a large
  
  
  
  1.55      +99 -16    apache/src/http_config.c
  
  Index: http_config.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_config.c,v
  retrieving revision 1.54
  retrieving revision 1.55
  diff -C3 -r1.54 -r1.55
  *** http_config.c	1997/06/29 19:05:20	1.54
  --- http_config.c	1997/06/30 21:18:11	1.55
  ***************
  *** 144,150 ****
    void *
    merge_per_dir_configs (pool *p, void *base, void *new)
    {
  !    void **conf_vector = (void **)pcalloc(p, sizeof(void*) * total_modules);
       void **base_vector = (void **) base;
       void **new_vector = (void **) new;
       module *modp;
  --- 144,150 ----
    void *
    merge_per_dir_configs (pool *p, void *base, void *new)
    {
  !    void **conf_vector = (void **)palloc(p, sizeof(void*) * total_modules);
       void **base_vector = (void **) base;
       void **new_vector = (void **) new;
       module *modp;
  ***************
  *** 250,269 ****
     * do the dirty work of slogging through the module structures.
     */
    
  ! int
    run_method (request_rec *r, int offset, int run_all)
    {
  !    module *modp;
  !    for (modp = top_module; modp; modp = modp->next) {
  !        handler mod_handler = *(handler *)(offset + (char *)(modp));
    
  !        if (mod_handler) {
               int result;
    
  -            Explain1("Run %s",ShowMethod(modp,offset));
    	   result = (*mod_handler)(r);
    
  - 	   Explain2("%s returned %d",ShowMethod(modp,offset),result);
    	   if (result != DECLINED && (!run_all || result != OK))
    	       return result;
           }
  --- 250,350 ----
     * do the dirty work of slogging through the module structures.
     */
    
  ! /*
  !  * Optimized run_method routines.  The observation here is that many modules
  !  * have NULL for most of the methods.  So we build optimized lists of
  !  * everything.  If you think about it, this is really just like a sparse array
  !  * implementation to avoid scanning the zero entries.
  !  */
  ! static const int method_offsets[] = {
  !     XtOffsetOf (module, translate_handler),
  !     XtOffsetOf (module, check_user_id),
  !     XtOffsetOf (module, auth_checker),
  !     XtOffsetOf (module, access_checker),
  !     XtOffsetOf (module, type_checker),
  !     XtOffsetOf (module, fixer_upper),
  !     XtOffsetOf (module, logger),
  !     XtOffsetOf (module, header_parser)
  ! };
  ! #define NMETHODS	(sizeof (method_offsets)/sizeof (method_offsets[0]))
  ! 
  ! static struct {
  !     int translate_handler;
  !     int check_user_id;
  !     int auth_checker;
  !     int access_checker;
  !     int type_checker;
  !     int fixer_upper;
  !     int logger;
  !     int header_parser;
  ! } offsets_into_method_ptrs;
  ! 
  ! /*
  !  * This is just one big array of method_ptrs.  It's constructed such that,
  !  * for example, method_ptrs[ offsets_into_method_ptrs.logger ] is the first
  !  * logger function.  You go one-by-one from there until you hit a NULL.
  !  * This structure was designed to hopefully maximize cache-coolness.
  !  */
  ! static handler *method_ptrs;
  ! 
  ! /* routine to reconstruct all these shortcuts... called after every
  !  * add_module.
  !  * XXX: this breaks if modules dink with their methods pointers
  !  */
  ! static void
  ! build_method_shortcuts (void)
  ! {
  !     module *modp;
  !     int how_many_ptrs;
  !     int i;
  !     int next_ptr;
  !     handler fp;
  ! 
  !     if (method_ptrs) {
  ! 	/* free up any previous set of method_ptrs */
  ! 	free (method_ptrs);
  !     }
  ! 
  !     /* first we count how many functions we have */
  !     how_many_ptrs = 0;
  !     for (modp = top_module; modp; modp = modp->next) {
  ! 	for (i = 0; i<NMETHODS; ++i) {
  ! 	    if (*(handler *)(method_offsets[i] + (char *)modp)) {
  ! 		++how_many_ptrs;
  ! 	    }
  ! 	}
  !     }
  !     method_ptrs = malloc ((how_many_ptrs+NMETHODS)*sizeof (handler));
  !     next_ptr = 0;
  !     for (i = 0; i<NMETHODS; ++i) {
  ! 	/* XXX: This is an itsy bit presumptuous about the alignment
  ! 	 * constraints on offsets_into_method_ptrs.  I can't remember if
  ! 	 * ANSI says this has to be true... -djg */
  ! 	((int *)&offsets_into_method_ptrs)[i] = next_ptr;
  ! 	for (modp = top_module; modp; modp = modp->next) {
  ! 	    fp = *(handler *)(method_offsets[i] + (char *)modp);
  ! 	    if (fp) {
  ! 		method_ptrs[next_ptr++] = fp;
  ! 	    }
  ! 	}
  ! 	method_ptrs[next_ptr++] = NULL;
  !     }
  ! }
  ! 
  ! 
  ! static int
    run_method (request_rec *r, int offset, int run_all)
    {
  !     int i;
  ! 
  !     for (i = offset; method_ptrs[i]; ++i ) {
  ! 	handler mod_handler = method_ptrs[i];
    
  ! 	if (mod_handler) {
               int result;
    
    	   result = (*mod_handler)(r);
    
    	   if (result != DECLINED && (!run_all || result != OK))
    	       return result;
           }
  ***************
  *** 273,299 ****
    }
    
    int translate_name(request_rec *r) {
  !    return run_method (r, XtOffsetOf (module, translate_handler), 0);
    }
    
    int check_access(request_rec *r) {
  !    return run_method (r, XtOffsetOf (module, access_checker), 1);
    }
    
    int find_types (request_rec *r) {
  !    return run_method (r, XtOffsetOf (module, type_checker), 0);
    }
    
    int run_fixups (request_rec *r) {
  !    return run_method (r, XtOffsetOf (module, fixer_upper), 1);
    }
    
    int log_transaction (request_rec *r) {
  !    return run_method (r, XtOffsetOf (module, logger), 1);
    }
    
    int header_parse (request_rec *r) {
  !     return run_method (r, XtOffsetOf (module, header_parser), 1);
    }
    
    /* Auth stuff --- anything that defines one of these will presumably
  --- 354,380 ----
    }
    
    int translate_name(request_rec *r) {
  !    return run_method (r, offsets_into_method_ptrs.translate_handler, 0);
    }
    
    int check_access(request_rec *r) {
  !    return run_method (r, offsets_into_method_ptrs.access_checker, 1);
    }
    
    int find_types (request_rec *r) {
  !    return run_method (r, offsets_into_method_ptrs.type_checker, 0);
    }
    
    int run_fixups (request_rec *r) {
  !    return run_method (r, offsets_into_method_ptrs.fixer_upper, 1);
    }
    
    int log_transaction (request_rec *r) {
  !    return run_method (r, offsets_into_method_ptrs.logger, 1);
    }
    
    int header_parse (request_rec *r) {
  !     return run_method (r, offsets_into_method_ptrs.header_parser, 1);
    }
    
    /* Auth stuff --- anything that defines one of these will presumably
  ***************
  *** 302,312 ****
     */
    
    int check_user_id (request_rec *r) {
  !    return run_method (r, XtOffsetOf (module, check_user_id), 0);
    }
    
    int check_auth (request_rec *r) {
  !    return run_method (r, XtOffsetOf (module, auth_checker), 0);
    }
    
    int invoke_handler (request_rec *r)
  --- 383,393 ----
     */
    
    int check_user_id (request_rec *r) {
  !    return run_method (r, offsets_into_method_ptrs.check_user_id, 0);
    }
    
    int check_auth (request_rec *r) {
  !    return run_method (r, offsets_into_method_ptrs.auth_checker, 0);
    }
    
    int invoke_handler (request_rec *r)
  ***************
  *** 391,396 ****
  --- 472,479 ----
        if (m->module_index == -1) {
    	m->module_index = num_modules++;
        }
  +     /** XXX: this will be slow if there's lots of add_modules */
  +     build_method_shortcuts ();
    }
    
    void setup_prelinked_modules ()