stas        2004/09/29 20:30:29

  Modified:    .        Changes
               src/modules/perl modperl_callback.c
  Added:       t/hooks/TestHooks inlined_handlers.pm
               t/hooks  inlined_handlers.t
  Log:
  fix a bug in non-ithreaded-perl implementation where the cached
  compiled CODE refs of httpd.conf-inlined one-liner handlers like:
  PerlFixupHandler 'sub { use Apache::Const qw(DECLINED); DECLINED }'
  didn't have the reference count right.
  
  Revision  Changes    Path
  1.1                  modperl-2.0/t/hooks/TestHooks/inlined_handlers.pm
  
  Index: inlined_handlers.pm
  ===================================================================
  package TestHooks::inlined_handlers;
  
  # this test exercises httpd.conf inlined one-liner handlers, like:
  #   PerlFixupHandler 'sub { use Apache::Const qw(DECLINED); DECLINED }'
  # previously there was a bug in non-ithreaded-perl implementation
  # where the cached compiled CODE ref didn't have the reference count
  # right.
  #
  # this test needs to run via the same_interpr framework, since it must
  # test that the same perl interprter/process gets to run the same
  # inlined handler
  
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::RequestIO ();
  
  use Apache::Const -compile => 'OK';
  
  sub handler {
      my $r = shift;
  
      $r->print('ok');
  
      Apache::OK;
  }
  
  1;
  __DATA__
  <NoAutoConfig>
    <Location /TestHooks__inlined_handlers>
        SetHandler modperl
        PerlInitHandler     Apache::TestHandler::same_interp_fixup
        PerlFixupHandler    'sub { use Apache::Const qw(DECLINED); DECLINED }'
        PerlResponseHandler TestHooks::inlined_handlers
    </Location>
  </NoAutoConfig>
  
  
  
  1.1                  modperl-2.0/t/hooks/inlined_handlers.t
  
  Index: inlined_handlers.t
  ===================================================================
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Test;
  use Apache::TestUtil;
  use Apache::TestRequest;
  
  plan tests => 2;
  
  my $location = "/TestHooks__inlined_handlers";
  
  t_debug "getting the same interp ID for $location";
  my $same_interp = Apache::TestRequest::same_interp_tie($location);
  
  my $skip = $same_interp ? 0 : 1;
  my $expected = "ok";
  for (1..2) {
      my $received = get_body($same_interp, \&GET, $location);
      $skip++ unless defined $received;
      skip_not_same_interp(
          $skip,
          $received,
          $expected,
          "anonymous handlers in httpd.conf test"
      );
  }
  
  # if we fail to find the same interpreter, return undef (this is not
  # an error)
  sub get_body {
      my $res = eval {
          Apache::TestRequest::same_interp_do(@_);
      };
      return undef if $@ =~ /unable to find interp/;
      return $res->content if $res;
      die $@ if $@;
  }
  
  # make the tests resistant to a failure of finding the same perl
  # interpreter, which happens randomly and not an error.
  # the first argument is used to decide whether to skip the sub-test,
  # the rest of the arguments are passed to 'ok t_cmp';
  sub skip_not_same_interp {
      my $skip_cond = shift;
      if ($skip_cond) {
          skip "Skip couldn't find the same interpreter", 0;
      }
      else {
          my($package, $filename, $line) = caller;
          # trick ok() into reporting the caller filename/line when a
          # sub-test fails in sok()
          return eval <<EOE;
  #line $line $filename
      ok &t_cmp;
  EOE
      }
  }
  
  
  
  1.504     +5 -0      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.503
  retrieving revision 1.504
  diff -u -u -r1.503 -r1.504
  --- Changes   28 Sep 2004 18:14:30 -0000      1.503
  +++ Changes   30 Sep 2004 03:30:29 -0000      1.504
  @@ -12,6 +12,11 @@
   
   =item 1.99_17-dev
   
  +fix a bug in non-ithreaded-perl implementation where the cached
  +compiled CODE refs of httpd.conf-inlined one-liner handlers like:
  +PerlFixupHandler 'sub { use Apache::Const qw(DECLINED); DECLINED }'
  +didn't have the reference count right. [Stas]
  +
   per-server PerlSetEnv and PerlPassEnv values are properly added
   to %ENV when only a per-directory handler is configured.
   [Geoffrey Young]
  
  
  
  1.80      +1 -0      modperl-2.0/src/modules/perl/modperl_callback.c
  
  Index: modperl_callback.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_callback.c,v
  retrieving revision 1.79
  retrieving revision 1.80
  diff -u -u -r1.79 -r1.80
  --- modperl_callback.c        29 Sep 2004 20:57:51 -0000      1.79
  +++ modperl_callback.c        30 Sep 2004 03:30:29 -0000      1.80
  @@ -79,6 +79,7 @@
           if (!handler->cv) {
               SV *sv = eval_pv(handler->name, TRUE); 
               handler->cv = (CV*)SvRV(sv); /* cache */
  +            SvREFCNT_inc(handler->cv);
           }
           cv = handler->cv;
   #endif
  
  
  

Reply via email to