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