stas        2004/06/02 11:49:22

  Modified:    src/modules/perl modperl_filter.c
               xs       modperl_xs_util.h
               xs/APR/PerlIO apr_perlio.c
               xs/Apache/Filter Apache__Filter.h
               xs/Apache/RequestIO Apache__RequestIO.h
  Log:
  improve the error handling
  
  Revision  Changes    Path
  1.92      +19 -21    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.91
  retrieving revision 1.92
  diff -u -u -r1.91 -r1.92
  --- modperl_filter.c  1 Jun 2004 20:16:46 -0000       1.91
  +++ modperl_filter.c  2 Jun 2004 18:49:21 -0000       1.92
  @@ -649,12 +649,8 @@
                          (unsigned long)filter->bucket);
           }
           else {
  -            MP_TRACE_f(MP_FUNC,
  -                       MP_FILTER_NAME_FORMAT
  -                       "read in: apr_bucket_read error: %s\n",
  -                       MP_FILTER_NAME(filter->f),
  -                       modperl_error_strerror(aTHX_ filter->rc));
  -            return len;
  +            SvREFCNT_dec(buffer);
  +            modperl_croak(aTHX_ filter->rc, "Apache::Filter::read");
           }
   
           if (buf_len) {
  @@ -692,32 +688,28 @@
       apr_size_t len = 0;
   
       if (!filter->bb_in) {
  -        apr_status_t rc;
           /* This should be read only once per handler invocation! */
           filter->bb_in = apr_brigade_create(filter->pool,
                                              filter->f->c->bucket_alloc);
  -        rc = ap_get_brigade(filter->f->next, filter->bb_in,
  -                            filter->input_mode, filter->block,
  -                            filter->readbytes);
  -        if (!(rc == APR_SUCCESS || rc == APR_EOF)) {
  -            modperl_croak(aTHX_ rc, "Apache::Filter::read"); 
  -        }
           MP_TRACE_f(MP_FUNC, MP_FILTER_NAME_FORMAT
                      "retrieving bb: 0x%lx\n",
                      MP_FILTER_NAME(filter->f),
                      (unsigned long)(filter->bb_in));
  +        MP_RUN_CROAK(ap_get_brigade(filter->f->next, filter->bb_in,
  +                                    filter->input_mode, filter->block,
  +                                    filter->readbytes),
  +                     "Apache::Filter::read");
       }
   
       len = modperl_filter_read(aTHX_ filter, buffer, wanted);
   
  -/*     if (APR_BRIGADE_EMPTY(filter->bb_in)) { */
  -/*         apr_brigade_destroy(filter->bb_in); */
  -/*         filter->bb_in = NULL; */
  -/*     } */
  -
       if (filter->flush && len == 0) {
           /* if len > 0 then $filter->write will flush */
  -        modperl_input_filter_flush(filter);
  +        apr_status_t rc = modperl_input_filter_flush(filter);
  +        if (rc != APR_SUCCESS) {
  +            SvREFCNT_dec(buffer);
  +            modperl_croak(aTHX_ rc, "Apache::Filter::read");
  +        }
       }
   
       return len;
  @@ -734,7 +726,11 @@
       
       if (filter->flush && len == 0) {
           /* if len > 0 then $filter->write will flush */
  -        MP_FAILURE_CROAK(modperl_output_filter_flush(filter));
  +        apr_status_t rc = modperl_output_filter_flush(filter);
  +        if (rc != APR_SUCCESS) {
  +            SvREFCNT_dec(buffer);
  +            modperl_croak(aTHX_ rc, "Apache::Filter::read");
  +        }
       }
   
       return len;
  @@ -1158,7 +1154,9 @@
           if (handler->attrs & MP_FILTER_HAS_INIT_HANDLER && handler->next) {
               int status = modperl_run_filter_init(f, mode, handler->next);
               if (status != OK) {
  -                /* XXX */
  +                modperl_croak(aTHX_ status, strEQ("InputFilter", type)
  +                              ? "Apache::Filter::add_input_filter"
  +                              : "Apache::Filter::add_output_filter");
               }
           }
           
  
  
  
  1.23      +2 -7      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.22
  retrieving revision 1.23
  diff -u -u -r1.22 -r1.23
  --- modperl_xs_util.h 4 May 2004 06:19:12 -0000       1.22
  +++ modperl_xs_util.h 2 Jun 2004 18:49:21 -0000       1.23
  @@ -94,17 +94,12 @@
       mpxs_usage_va(2, obj, msg);                 \
       arg = *MARK++
   
  -/* XXX: we probably shouldn't croak here */
  -#define mpxs_write_loop(func, obj)                              \
  +#define mpxs_write_loop(func, obj, name)                        \
       while (MARK <= SP) {                                        \
           apr_size_t wlen;                                        \
  -        apr_status_t rv;                                        \
           char *buf = SvPV(*MARK, wlen);                          \
           MP_TRACE_o(MP_FUNC, "%d bytes [%s]", wlen, buf);        \
  -        rv = func(aTHX_ obj, buf, &wlen);                       \
  -        if (rv != APR_SUCCESS) {                                \
  -            Perl_croak(aTHX_ modperl_error_strerror(aTHX_ rv)); \
  -        }                                                       \
  +        MP_RUN_CROAK(func(aTHX_ obj, buf, &wlen), name);        \
           bytes += wlen;                                          \
           MARK++;                                                 \
       }
  
  
  
  1.40      +5 -3      modperl-2.0/xs/APR/PerlIO/apr_perlio.c
  
  Index: apr_perlio.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/xs/APR/PerlIO/apr_perlio.c,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -u -r1.39 -r1.40
  --- apr_perlio.c      16 May 2004 09:19:40 -0000      1.39
  +++ apr_perlio.c      2 Jun 2004 18:49:21 -0000       1.40
  @@ -134,6 +134,9 @@
                  path ? path : "(UNKNOWN)", rc);
   
       if (rc != APR_SUCCESS) {
  +        /* it just so happens that since $! is tied to errno, we get
  +         * it set right via the system call that apr_file_open has
  +         * performed internally, no need to do anything special */
           PerlIO_pop(aTHX_ f);
           return NULL;
       }
  @@ -144,7 +147,7 @@
   
   static IV PerlIOAPR_fileno(pTHX_ PerlIO *f)
   {
  -    /* apr_file_t* is an opaque struct, so fileno is not available
  +    /* apr_file_t* is an opaque struct, so fileno is not available.
        * -1 in this case indicates that the layer cannot provide fileno
        */
       return -1;
  @@ -190,8 +193,7 @@
           return count;
       }
       else if (rc != APR_SUCCESS) {
  -        Perl_croak(aTHX_ "failed to read from file: %s",
  -                   modperl_error_strerror(aTHX_ rc));
  +        modperl_croak(aTHX_ rc, "APR::PerlIO::read");  
       }
   
       return count;
  
  
  
  1.40      +4 -2      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.39
  retrieving revision 1.40
  diff -u -u -r1.39 -r1.40
  --- Apache__Filter.h  1 Jun 2004 23:33:50 -0000       1.39
  +++ Apache__Filter.h  2 Jun 2004 18:49:22 -0000       1.40
  @@ -34,10 +34,12 @@
       MP_TRACE_f(MP_FUNC, "from %s\n",
                  ((modperl_filter_ctx_t *)modperl_filter->f->ctx)->handler->name);    
       if (modperl_filter->mode == MP_OUTPUT_FILTER_MODE) {
  -        mpxs_write_loop(modperl_output_filter_write, modperl_filter);
  +        mpxs_write_loop(modperl_output_filter_write,
  +                        modperl_filter, "Apache::Filter::print");
       }
       else {
  -        mpxs_write_loop(modperl_input_filter_write, modperl_filter);
  +        mpxs_write_loop(modperl_input_filter_write,
  +                        modperl_filter, "Apache::Filter::print");
       }
   
       /* XXX: ap_rflush if $| */
  
  
  
  1.46      +4 -2      modperl-2.0/xs/Apache/RequestIO/Apache__RequestIO.h
  
  Index: Apache__RequestIO.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/xs/Apache/RequestIO/Apache__RequestIO.h,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -u -r1.45 -r1.46
  --- Apache__RequestIO.h       29 Apr 2004 00:06:41 -0000      1.45
  +++ Apache__RequestIO.h       2 Jun 2004 18:49:22 -0000       1.46
  @@ -60,7 +60,8 @@
       MP_START_TIMES();
   
       MP_CHECK_WBUCKET_INIT("$r->puts");
  -    mpxs_write_loop(modperl_wbucket_write, rcfg->wbucket);
  +    mpxs_write_loop(modperl_wbucket_write, rcfg->wbucket,
  +                    "Apache::RequestIO::puts");
   
       MP_END_TIMES();
       MP_PRINT_TIMES("r->puts");
  @@ -88,7 +89,8 @@
       rcfg = modperl_config_req_get(r);
   
       MP_CHECK_WBUCKET_INIT("$r->print");
  -    mpxs_write_loop(modperl_wbucket_write, rcfg->wbucket);
  +    mpxs_write_loop(modperl_wbucket_write, rcfg->wbucket,
  +                    "Apache::RequestIO::print");
       
       mpxs_output_flush(r, rcfg);
       
  
  
  

Reply via email to