stas        2003/12/10 23:35:09

  Modified:    src/modules/perl modperl_filter.c
               .        Changes
  Log:
  use plain malloc/free to allocate filter structs, since they could be
  invoked hundreds of times during a single request, causing huge memory
  demands if the memory is allocated from the pool, which gets destroyed
  only at the end of a request.
  
  Revision  Changes    Path
  1.76      +14 -3     modperl-2.0/src/modules/perl/modperl_filter.c
  
  Index: modperl_filter.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v
  retrieving revision 1.75
  retrieving revision 1.76
  diff -u -u -r1.75 -r1.76
  --- modperl_filter.c  10 Dec 2003 01:46:28 -0000      1.75
  +++ modperl_filter.c  11 Dec 2003 07:35:09 -0000      1.76
  @@ -251,8 +251,16 @@
                                        apr_read_type_e block,
                                        apr_off_t readbytes)
   {
  +
       apr_pool_t *p = MP_FILTER_POOL(f);
  -    modperl_filter_t *filter = apr_pcalloc(p, sizeof(*filter));
  +    modperl_filter_t *filter;
  +
  +    /* we can't allocate memory from the pool here, since potentially
  +     * a filter can be called hundreds of times during the same
  +     * request/connection resulting in enormous memory demands
  +     * (sizeof(*filter)*number of invocations)
  +     */
  +    Newz(0, filter, 1, modperl_filter_t);
   
       filter->mode = mode;
       filter->f = f;
  @@ -369,6 +377,7 @@
       conn_rec    *c = f->c;
       server_rec  *s = r ? r->server : c->base_server;
       apr_pool_t  *p = r ? r->pool : c->pool;
  +    modperl_filter_t *filter = modperl_filter_new(f, NULL, mode, 0, 0, 0);
   
       MP_dINTERP_SELECT(r, c, s);    
   
  @@ -378,14 +387,14 @@
                                 "Apache::Filter", f,
                                 NULL);
   
  -    modperl_filter_mg_set(aTHX_ AvARRAY(args)[0],
  -                          modperl_filter_new(f, NULL, mode, 0, 0, 0));
  +    modperl_filter_mg_set(aTHX_ AvARRAY(args)[0], filter);
   
       /* XXX filters are VOID handlers.  should we ignore the status? */
       if ((status = modperl_callback(aTHX_ handler, p, r, s, args)) != OK) {
           status = modperl_errsv(aTHX_ status, r, s);
       }
   
  +    safefree(filter);
       SvREFCNT_dec((SV*)args);
   
       MP_INTERP_PUTBACK(interp);
  @@ -792,6 +801,7 @@
           filter = modperl_filter_new(f, bb, MP_OUTPUT_FILTER_MODE,
                                       0, 0, 0);
           status = modperl_run_filter(filter);
  +        safefree(filter);
       }
       
       switch (status) {
  @@ -825,6 +835,7 @@
           filter = modperl_filter_new(f, bb, MP_INPUT_FILTER_MODE,
                                       input_mode, block, readbytes);
           status = modperl_run_filter(filter);
  +        safefree(filter);
       }
       
       switch (status) {
  
  
  
  1.276     +5 -0      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.275
  retrieving revision 1.276
  diff -u -u -r1.275 -r1.276
  --- Changes   10 Dec 2003 08:41:22 -0000      1.275
  +++ Changes   11 Dec 2003 07:35:09 -0000      1.276
  @@ -12,6 +12,11 @@
   
   =item 1.99_12-dev
   
  +use plain malloc/free to allocate filter structs, since they could be
  +invoked hundreds of times during a single request, causing huge memory
  +demands if the memory is allocated from the pool, which gets destroyed
  +only at the end of a request. [Stas]
  +
   Fix a compilation error in APX.xs when MP_HAVE_APR_LIBS is not defined
   [Fred Moyer <[EMAIL PROTECTED]>]
   
  
  
  

Reply via email to