You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by go...@apache.org on 2007/10/13 08:48:16 UTC
svn commit: r584380 - in /perl/modperl/trunk: Changes
src/modules/perl/modperl_util.c t/modperl/pnotes2.t
t/response/TestModperl/pnotes2.pm
Author: gozer
Date: Fri Oct 12 23:48:14 2007
New Revision: 584380
URL: http://svn.apache.org/viewvc?rev=584380&view=rev
Log:
Don't increase the refcnt of the pnotes HV* twice, we
will leak it.
Submitted-By: Torsten Foertsch <to...@gmx.net>
Message-Id: <20...@gmx.net>
Reviewed-By: gozer
Added:
perl/modperl/trunk/t/modperl/pnotes2.t
perl/modperl/trunk/t/response/TestModperl/pnotes2.pm
Modified:
perl/modperl/trunk/Changes
perl/modperl/trunk/src/modules/perl/modperl_util.c
Modified: perl/modperl/trunk/Changes
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/Changes?rev=584380&r1=584379&r2=584380&view=diff
==============================================================================
--- perl/modperl/trunk/Changes (original)
+++ perl/modperl/trunk/Changes Fri Oct 12 23:48:14 2007
@@ -12,6 +12,9 @@
=item 2.0.4-dev
+Fix a bug that would prevent pnotes from being cleaned up proprely
+at the end of the request [Torsten Foertsch]
+
On Win32, embed the manifest file, if present, in mod_perl.so,
so as to work with VC 8 [Steve Hay, Randy Kobes]
Modified: perl/modperl/trunk/src/modules/perl/modperl_util.c
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_util.c?rev=584380&r1=584379&r2=584380&view=diff
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_util.c (original)
+++ perl/modperl/trunk/src/modules/perl/modperl_util.c Fri Oct 12 23:48:14 2007
@@ -895,11 +895,9 @@
else if (hv_exists(*pnotes, k, len)) {
retval = *hv_fetch(*pnotes, k, len, FALSE);
}
- }
- else {
- retval = newRV_inc((SV *)*pnotes);
- }
- return retval ? SvREFCNT_inc(retval) : &PL_sv_undef;
+ return retval ? SvREFCNT_inc(retval) : &PL_sv_undef;
+ }
+ return newRV_inc((SV *)*pnotes);
}
Added: perl/modperl/trunk/t/modperl/pnotes2.t
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/t/modperl/pnotes2.t?rev=584380&view=auto
==============================================================================
--- perl/modperl/trunk/t/modperl/pnotes2.t (added)
+++ perl/modperl/trunk/t/modperl/pnotes2.t Fri Oct 12 23:48:14 2007
@@ -0,0 +1,32 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::TestRequest qw(GET_BODY);
+use Apache::Test;
+use Apache::TestUtil;
+use Apache::TestUtil qw/t_start_error_log_watch t_finish_error_log_watch/;
+
+my $module = 'TestModperl::pnotes2';
+my $url = Apache::TestRequest::module2url($module);
+my ($u, $ok);
+
+t_debug("connecting to $url");
+
+plan tests => 12, need_lwp;
+
+Apache::TestRequest::user_agent(reset => 1, keep_alive => 0);
+
+for my $i (1..12) {
+ t_client_log_warn_is_expected();
+ t_start_error_log_watch;
+ $u="$url?$i"; $ok=GET_BODY $u;
+ select undef, undef, undef, 0.2; # give it time to write the logfile
+ ok t_cmp scalar(grep {
+ /pnotes are destroyed after cleanup passed/;
+ } t_finish_error_log_watch), 1, $u;
+}
+
+# Local Variables: #
+# mode: cperl #
+# cperl-indent-level: 4 #
+# End: #
Added: perl/modperl/trunk/t/response/TestModperl/pnotes2.pm
URL: http://svn.apache.org/viewvc/perl/modperl/trunk/t/response/TestModperl/pnotes2.pm?rev=584380&view=auto
==============================================================================
--- perl/modperl/trunk/t/response/TestModperl/pnotes2.pm (added)
+++ perl/modperl/trunk/t/response/TestModperl/pnotes2.pm Fri Oct 12 23:48:14 2007
@@ -0,0 +1,89 @@
+package TestModperl::pnotes2;
+
+use strict;
+use warnings FATAL => 'all';
+
+use Apache2::Log ();
+use Apache2::RequestUtil ();
+use Apache2::ConnectionUtil ();
+
+use Apache2::Const -compile => 'OK';
+
+{
+ package TestModerl::pnotes2::x;
+ use strict;
+ use warnings FATAL => 'all';
+
+ sub new {shift;bless [@_];}
+ sub DESTROY {my $f=shift @{$_[0]}; $f->(@{$_[0]});}
+}
+
+sub line {
+ our $cleanup;
+
+ Apache2::ServerRec::warn "pnotes are destroyed after cleanup ".$cleanup;
+}
+
+sub cleanup {
+ our $cleanup;
+ $cleanup='passed';
+
+ return Apache2::Const::OK;
+}
+
+sub handler {
+ my $r = shift;
+
+ our $cleanup;
+ $cleanup='';
+
+ $r->push_handlers( PerlCleanupHandler=>__PACKAGE__.'::cleanup' );
+
+ if(!defined $r->args) {
+ } elsif($r->args == 1) {
+ $r->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
+ } elsif($r->args == 2) {
+ $r->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
+ } elsif($r->args == 3) {
+ $r->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
+ $r->pnotes(x2 => 2);
+ } elsif($r->args == 4) {
+ $r->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
+ $r->pnotes->{x2} = 2;
+ } elsif($r->args == 5) {
+ $r->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
+ $r->pnotes->{x2} = 2;
+ } elsif($r->args == 6) {
+ $r->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
+ $r->pnotes(x2 => 2);
+ } elsif($r->args == 7) {
+ $r->connection->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
+ } elsif($r->args == 8) {
+ $r->connection->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
+ } elsif($r->args == 9) {
+ $r->connection->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
+ $r->connection->pnotes(x2 => 2);
+ } elsif($r->args == 10) {
+ $r->connection->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
+ $r->connection->pnotes->{x2} = 2;
+ } elsif($r->args == 11) {
+ $r->connection->pnotes(x1 => TestModerl::pnotes2::x->new(\&line));
+ $r->connection->pnotes->{x2} = 2;
+ } elsif($r->args == 12) {
+ $r->connection->pnotes->{x1} = TestModerl::pnotes2::x->new(\&line);
+ $r->connection->pnotes(x2 => 2);
+ }
+
+ $r->content_type('text/plain');
+ $r->print("OK");
+
+ Apache2::Const::OK;
+}
+
+1;
+__END__
+
+# Local Variables: #
+# mode: cperl #
+# cperl-indent-level: 4 #
+# End: #