stas        2003/04/02 22:21:43

  Modified:    xs       modperl_xs_util.h
               xs/Apache/Filter Apache__Filter.h
               src/modules/perl modperl_filter.c
  Log:
  - filters tracing readability is now mucho improved
  - a small bug fix with eos bucket
  
  Revision  Changes    Path
  1.14      +4 -1      modperl-2.0/xs/modperl_xs_util.h
  
  Index: modperl_xs_util.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/xs/modperl_xs_util.h,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- modperl_xs_util.h 17 Jan 2003 03:08:31 -0000      1.13
  +++ modperl_xs_util.h 3 Apr 2003 06:21:42 -0000       1.14
  @@ -80,10 +80,13 @@
   arg = *MARK++
   
   /* XXX: we probably shouldn't croak here */
  -#define mpxs_write_loop(func,obj) \
  +#define mpxs_write_loop(func, obj) \
       while (MARK <= SP) { \
           apr_ssize_t wlen; \
           char *buf = SvPV(*MARK, wlen); \
  +        MP_TRACE_f(MP_FUNC, "   %s\n\n\tbuffer out: %d bytes\n", \
  +                  ((modperl_filter_ctx_t *)obj->f->ctx)->handler->name, \
  +                  wlen); \
           apr_status_t rv = func(aTHX_ obj, buf, &wlen); \
           if (rv != APR_SUCCESS) { \
               Perl_croak(aTHX_ modperl_apr_strerror(rv)); \
  
  
  
  1.27      +2 -6      modperl-2.0/xs/Apache/Filter/Apache__Filter.h
  
  Index: Apache__Filter.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/xs/Apache/Filter/Apache__Filter.h,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- Apache__Filter.h  1 Apr 2003 05:20:50 -0000       1.26
  +++ Apache__Filter.h  3 Apr 2003 06:21:43 -0000       1.27
  @@ -193,12 +193,8 @@
       mpxs_usage_va_1(modperl_filter, "$filter->remove()");
       f = modperl_filter->f;
   
  -#ifdef MP_TRACE
  -    {
  -        modperl_filter_ctx_t *ctx = (modperl_filter_ctx_t *)(f->ctx);
  -        MP_TRACE_f(MP_FUNC, "removing filter %s\n", ctx->handler->name);
  -    }
  -#endif
  +    MP_TRACE_f(MP_FUNC, "   %s\n\n\tfilter removes itself\n",
  +               ((modperl_filter_ctx_t *)f->ctx)->handler->name);
       
       if (modperl_filter->mode == MP_INPUT_FILTER_MODE) {
           ap_remove_input_filter(f);
  
  
  
  1.57      +100 -37   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.56
  retrieving revision 1.57
  diff -u -r1.56 -r1.57
  --- modperl_filter.c  14 Mar 2003 05:33:18 -0000      1.56
  +++ modperl_filter.c  3 Apr 2003 06:21:43 -0000       1.57
  @@ -2,8 +2,37 @@
   
   /* helper funcs */
   
  +#define MP_FILTER_NAME_FORMAT "   %s\n\n\t"
  +
  +#define MP_FILTER_NAME(f) \
  +    ((modperl_filter_ctx_t *)f->ctx)->handler->name
  +
  +#define MP_FILTER_TYPE(filter) \
  +    ((modperl_filter_ctx_t *)filter->f->ctx)->handler->attrs & \
  +        MP_FILTER_CONNECTION_HANDLER  ? "connection" : "request"
  +
  +#define MP_FILTER_MODE(filter) \
  +    (filter->mode == MP_INPUT_FILTER_MODE ? "input" : "output")
  +
   #define MP_FILTER_POOL(f) f->r ? f->r->pool : f->c->pool
   
  +/* this function is for tracing only, it's not optimized for performance */
  +static const char* next_filter_name(ap_filter_t *f)
  +{
  +    const char *name = f->frec->name;
  +
  +    /* frec->name is always lowercased */ 
  +    if (ap_strcasecmp_match(name, MP_FILTER_CONNECTION_INPUT_NAME)  ||
  +        ap_strcasecmp_match(name, MP_FILTER_CONNECTION_OUTPUT_NAME) ||
  +        ap_strcasecmp_match(name, MP_FILTER_REQUEST_INPUT_NAME)     ||
  +        ap_strcasecmp_match(name, MP_FILTER_REQUEST_OUTPUT_NAME) ) {
  +        return ((modperl_filter_ctx_t *)f->ctx)->handler->name;
  +    }
  +    else {
  +        return name;
  +    }
  +}
  +
   MP_INLINE static apr_status_t send_input_eos(modperl_filter_t *filter)
   {
       apr_bucket_alloc_t *ba = filter->f->c->bucket_alloc;
  @@ -29,8 +58,9 @@
       apr_bucket *b = apr_bucket_eos_create(ba);
       APR_BRIGADE_INSERT_TAIL(bb, b);
       ((modperl_filter_ctx_t *)f->ctx)->sent_eos = 1;
  -    MP_TRACE_f(MP_FUNC, "sending EOS bucket in separate bb\n");
  -    return ap_pass_brigade(f, bb);
  +    MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +               "write out: EOS bucket in separate bb\n", MP_FILTER_NAME(f));
  +    return ap_pass_brigade(f->next, bb);
   }
   
   MP_INLINE static apr_status_t send_output_flush(ap_filter_t *f)
  @@ -40,7 +70,8 @@
                                                   ba);
       apr_bucket *b = apr_bucket_flush_create(ba);
       APR_BRIGADE_INSERT_TAIL(bb, b);
  -    MP_TRACE_f(MP_FUNC, "sending FLUSH bucket in separate bb\n");
  +    MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +               "write out: FLUSH bucket in separate bb\n", MP_FILTER_NAME(f));
       return ap_pass_brigade(f, bb);
   }
   
  @@ -109,7 +140,12 @@
           APR_BRIGADE_INSERT_TAIL(bb, bucket);
       }
           
  -    MP_TRACE_f(MP_FUNC, "buffer length=%d\n", len);
  +    MP_TRACE_f(MP_FUNC, "\n\n\twrite out: %d bytes\n"
  +               "\t\tfrom %s\n\t\tto %s filter handler\n",
  +               len, 
  +               (wb->r && wb->filters == &wb->r->output_filters)
  +                   ? "response handler" : "current filter handler",
  +               next_filter_name(*(wb->filters)));
   
       return ap_pass_brigade(*(wb->filters), bb);
   }
  @@ -193,10 +229,12 @@
           filter->bb_in  = bb;
           filter->bb_out = NULL;
       }
  -    
  -    MP_TRACE_f(MP_FUNC, "filter=0x%lx, mode=%s\n",
  -               (unsigned long)filter,
  -               mode == MP_INPUT_FILTER_MODE ? "input" : "output");
  +
  +    MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +               "new: %s %s filter (0x%lx)\n",
  +               MP_FILTER_NAME(f),
  +               MP_FILTER_TYPE(filter), MP_FILTER_MODE(filter),
  +               (unsigned long)filter);
   
       return filter;
   }
  @@ -249,8 +287,6 @@
   
       SvREFCNT_dec((SV*)args);
   
  -    MP_TRACE_f(MP_FUNC, "%s returned %d\n", handler->name, status);
  -
       /* when the streaming filter is invoked it should be able to send
        * extra data, after the read in a while() loop is finished.
        * Therefore we need to postpone propogating the EOS bucket, up
  @@ -277,6 +313,9 @@
           MP_FAILURE_CROAK(modperl_output_filter_flush(filter));
       }
   
  +    MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +               "return: %d\n", handler->name, status);
  +    
       return status;
   }
   
  @@ -304,8 +343,9 @@
   MP_INLINE static int get_bucket(modperl_filter_t *filter)
   {
       if (!filter->bb_in || MP_FILTER_EMPTY(filter)) {
  -        MP_TRACE_f(MP_FUNC, "%s filter bucket brigade is empty\n",
  -               (filter->mode == MP_INPUT_FILTER_MODE ? "input" : "output"));
  +        MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +                   "read in: bucket brigade is empty\n",
  +                   MP_FILTER_NAME(filter->f));
           return 0;
       }
       
  @@ -325,9 +365,9 @@
       }
       
       if (MP_FILTER_IS_EOS(filter)) {
  -        MP_TRACE_f(MP_FUNC, "%s filter received EOS bucket\n",
  -                   (filter->mode == MP_INPUT_FILTER_MODE
  -                    ? "input" : "output"));
  +        MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +                   "read in: EOS bucket\n",
  +                   MP_FILTER_NAME(filter->f));
   
           filter->seen_eos = 1;
           /* there should be only one EOS sent, modperl_filter_read will
  @@ -336,10 +376,9 @@
           return 0;
       }
       else if (MP_FILTER_IS_FLUSH(filter)) {
  -        MP_TRACE_f(MP_FUNC, "%s filter received FLUSH bucket\n",
  -                   (filter->mode == MP_INPUT_FILTER_MODE
  -                    ? "input" : "output"));
  -
  +        MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +                   "read in: FLUSH bucket\n",
  +                   MP_FILTER_NAME(filter->f));
           filter->flush = 1;
           return 0;
       }
  @@ -372,14 +411,17 @@
       
       /*modperl_brigade_dump(filter->bb_in, stderr);*/
   
  -    MP_TRACE_f(MP_FUNC, "%s filter wants %d bytes\n",
  -               (filter->mode == MP_INPUT_FILTER_MODE ? "input" : "output"),
  +    MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +               "wanted: %d bytes\n",
  +               MP_FILTER_NAME(filter->f),
                  wanted);
   
       if (filter->remaining) {
           if (filter->remaining >= wanted) {
  -            MP_TRACE_f(MP_FUNC,
  -                       "eating/returning %d of remaining %d leftover bytes\n",
  +            MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +                       "eating and returning %d of "
  +                       "remaining %d leftover bytes\n",
  +                       MP_FILTER_NAME(filter->f),
                          wanted, filter->remaining);
               sv_catpvn(buffer, filter->leftover, wanted);
               filter->leftover += wanted;
  @@ -387,7 +429,9 @@
               return wanted;
           }
           else {
  -            MP_TRACE_f(MP_FUNC, "eating remaining %d leftover bytes\n",
  +            MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +                       "eating remaining %d leftover bytes\n",
  +                       MP_FILTER_NAME(filter->f),
                          filter->remaining);
               sv_catpvn(buffer, filter->leftover, filter->remaining);
               len = filter->remaining;
  @@ -410,14 +454,18 @@
   
           if (filter->rc == APR_SUCCESS) {
               MP_TRACE_f(MP_FUNC,
  -                       "bucket=%s(0x%lx) read returned %d bytes\n",
  +                       MP_FILTER_NAME_FORMAT
  +                       "read in: %s bucket with %d bytes (0x%lx)\n",
  +                       MP_FILTER_NAME(filter->f),
                          filter->bucket->type->name,
  -                       (unsigned long)filter->bucket,
  -                       buf_len);
  +                       buf_len,
  +                       (unsigned long)filter->bucket);
           }
           else {
               MP_TRACE_f(MP_FUNC,
  -                       "apr_bucket_read error: %s\n",
  +                       MP_FILTER_NAME_FORMAT
  +                       "read in: apr_bucket_read error: %s\n",
  +                       MP_FILTER_NAME(filter->f),
                          modperl_apr_strerror(filter->rc));
               return len;
           }
  @@ -439,8 +487,9 @@
       }
   
       MP_TRACE_f(MP_FUNC,
  -               "returning %d bytes from %d bucket%s "
  -               "(%d bytes leftover)\n",
  +               MP_FILTER_NAME_FORMAT
  +               "return: %d bytes from %d bucket%s (%d bytes leftover)\n",
  +               MP_FILTER_NAME(filter->f),
                  len, num_buckets, ((num_buckets == 1) ? "" : "s"),
                  filter->remaining);
   
  @@ -460,7 +509,9 @@
                                              filter->f->c->bucket_alloc);
           ap_get_brigade(filter->f->next, filter->bb_in,
                          filter->input_mode, filter->block, filter->readbytes);
  -        MP_TRACE_f(MP_FUNC, "retrieving bb: 0x%lx\n",
  +        MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +                   "retrieving bb: 0x%lx\n",
  +                   MP_FILTER_NAME(filter->f),
                      (unsigned long)(filter->bb_in));
       }
   
  @@ -505,7 +556,9 @@
       }
       
       if (filter->eos || filter->flush) {
  -        MP_TRACE_f(MP_FUNC, "sending %s bucket\n",
  +        MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +                   "write out: %s bucket\n",
  +                   MP_FILTER_NAME(filter->f),
                      filter->eos ? "EOS" : "FLUSH");
           filter->rc = filter->eos ?
               send_input_eos(filter) : send_input_flush(filter);
  @@ -536,7 +589,7 @@
       }
   
       if (filter->eos) {
  -        filter->rc = send_output_eos(filter->f->next);
  +        filter->rc = send_output_eos(filter->f);
           if (filter->bb_in) {
               apr_brigade_destroy(filter->bb_in);
               filter->bb_in = NULL;
  @@ -556,7 +609,10 @@
       char *copy = apr_pstrndup(filter->pool, buf, *len);
       apr_bucket *bucket = apr_bucket_transient_create(copy, *len, ba);
       /* MP_TRACE_f(MP_FUNC, "writing %d bytes: %s\n", *len, copy); */
  -    MP_TRACE_f(MP_FUNC, "writing %d bytes:\n", *len);
  +    MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
  +               "write out: %d bytes:\n",
  +               MP_FILTER_NAME(filter->f),
  +               *len);
       APR_BRIGADE_INSERT_TAIL(filter->bb_out, bucket);
       /* modperl_brigade_dump(filter->bb_out, stderr); */
       return APR_SUCCESS;
  @@ -578,7 +634,10 @@
   
       if (((modperl_filter_ctx_t *)f->ctx)->sent_eos) {
           MP_TRACE_f(MP_FUNC,
  -                   "EOS was already sent, passing through the brigade\n");
  +                   MP_FILTER_NAME_FORMAT
  +                   "write_out: EOS was already sent, "
  +                   "passing through the brigade\n",
  +                   MP_FILTER_NAME(f));
           return ap_pass_brigade(f->next, bb);
       }
       else {
  @@ -608,7 +667,10 @@
   
       if (((modperl_filter_ctx_t *)f->ctx)->sent_eos) {
           MP_TRACE_f(MP_FUNC,
  -                   "EOS was already sent, passing through the brigade\n");
  +                   MP_FILTER_NAME_FORMAT
  +                   "write out: EOS was already sent, "
  +                   "passing through the brigade\n",
  +                   MP_FILTER_NAME(f));
           return ap_get_brigade(f->next, bb, input_mode, block, readbytes);
       }
       else {
  @@ -690,6 +752,8 @@
               while (f) {
                   const char *fname = f->frec->name;
   
  +                /* XXX: I think this won't work as f->frec->name gets
  +                 * lowercased when added to the chain */
                   if (*fname == 'M' && strEQ(fname, name)) {
                       modperl_handler_t *ctx_handler = 
                           ((modperl_filter_ctx_t *)f->ctx)->handler;
  @@ -793,7 +857,6 @@
       Perl_croak(aTHX_ "unable to resolve handler 0x%lx\n",
                  (unsigned long)callback);
   }
  -
   
   void modperl_brigade_dump(apr_bucket_brigade *bb, FILE *fp)
   {
  
  
  

Reply via email to