Author: gozer
Date: Sun Dec 30 21:55:42 2007
New Revision: 607681

URL: http://svn.apache.org/viewvc?rev=607681&view=rev
Log:
Forgot to add the test case for a previous fix.

Reviewed-By: gozer
Submitted-By: Torsten Foertsch <[EMAIL PROTECTED]>
Message-Id: <[EMAIL PROTECTED]>


Added:
    perl/modperl/branches/threading/t/perl/ithreads3.t
    perl/modperl/branches/threading/t/response/TestPerl/ithreads3.pm

Added: perl/modperl/branches/threading/t/perl/ithreads3.t
URL: 
http://svn.apache.org/viewvc/perl/modperl/branches/threading/t/perl/ithreads3.t?rev=607681&view=auto
==============================================================================
--- perl/modperl/branches/threading/t/perl/ithreads3.t (added)
+++ perl/modperl/branches/threading/t/perl/ithreads3.t Sun Dec 30 21:55:42 2007
@@ -0,0 +1,39 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestUtil;
+use Apache::TestRequest 'GET_BODY';
+
+plan tests => 6, need_apache_mpm('worker') && need_perl('ithreads');
+
+my $module = 'TestPerl::ithreads3';
+
+sub u {Apache::TestRequest::module2url($module, {path=>$_[0]})}
+sub t {
+  my $rc;
+  eval {
+    local $SIG{ALRM}=sub {die "Timeout\n"};
+    alarm 2;
+    eval {
+      $rc=GET_BODY u(shift);
+    };
+    alarm 0;
+  };
+  alarm 0;
+  return $rc;
+}
+
+t_debug("connecting to ".u(''));
+ok t_cmp t('/perl-script?1'), 2, 'perl-script 1';
+ok t_cmp t('/modperl?1'), 2, 'modperl 1';
+
+ok t_cmp t('/perl-script?2'), 5, 'perl-script 2';
+ok t_cmp t('/modperl?2'), 5, 'modperl 2';
+
+ok t_cmp t('/perl-script?3'), 3, 'perl-script 3';
+ok t_cmp t('/modperl?3'), 3, 'modperl 3';
+
+# Local Variables: #
+# mode: cperl #
+# End: #

Added: perl/modperl/branches/threading/t/response/TestPerl/ithreads3.pm
URL: 
http://svn.apache.org/viewvc/perl/modperl/branches/threading/t/response/TestPerl/ithreads3.pm?rev=607681&view=auto
==============================================================================
--- perl/modperl/branches/threading/t/response/TestPerl/ithreads3.pm (added)
+++ perl/modperl/branches/threading/t/response/TestPerl/ithreads3.pm Sun Dec 30 
21:55:42 2007
@@ -0,0 +1,108 @@
+package TestPerl::ithreads3;
+
+use strict;
+use warnings FATAL => 'all';
+
+use Apache2::RequestRec;
+use Apache2::RequestIO;
+use Apache2::RequestUtil;
+use APR::Pool;
+use Apache2::Const -compile => 'OK', 'DECLINED';
+
+# XXX: These tests rely on the assumption that the virtual host is not
+#      otherwise accessed. In this case the same interpreter is chosen
+#      for each phase. The $counter counts them.
+#      Of course if only 1 interp is configured it must be hit each time.
+
+my $counter=0;
+
+sub response {
+  my $r=shift;
+  $r->content_type('text/plain');
+  $r->print($counter);
+  return Apache2::Const::OK;
+}
+
+sub count { $counter++; return Apache2::Const::DECLINED; }
+
+sub clear_pool {
+  delete $_[0]->pnotes->{my_pool};
+  return Apache2::Const::DECLINED;
+}
+
+sub trans {
+  my $r=shift;
+  my $test=$r->args;
+  $counter=0;
+  if( $test eq '1' ) {
+    # this is to check for a bug in modperl_response_handler versus
+    # modperl_response_handler_cgi. The former used to allocate an
+    # extra interpreter for its work. In both cases $counter should be
+    # 2 in the response phase
+    $r->push_handlers( PerlMapToStorageHandler=>__PACKAGE__.'::count' );
+    $r->push_handlers( PerlFixupHandler=>__PACKAGE__.'::count' );
+  }
+  elsif( $test eq '2' ) {
+    # now add an extra PerlCleanupHandler. It is run each time the
+    # interp is released. So it is run after Trans, MapToStorage and
+    # Fixup. In the response phase $counter should be 5. After Response
+    # it is run again but that is after.
+    # This used to eat up all interpreters because modperl_interp_unselect
+    # calls modperl_config_request_cleanup that allocates a new interp
+    # to handle the cleanup. When this interp is then unselected
+    # modperl_interp_unselect gets called again but the cleanup handler is
+    # still installed. So the cycle starts again until all interpreters
+    # are in use or the stack runs out. Then the thread is locked infinitely
+    # or a segfault appears.
+    $r->push_handlers( PerlMapToStorageHandler=>__PACKAGE__.'::count' );
+    $r->push_handlers( PerlFixupHandler=>__PACKAGE__.'::count' );
+    $r->push_handlers( PerlCleanupHandler=>__PACKAGE__.'::count' );
+  }
+  elsif( $test eq '3' ) {
+    # a subpool adds an extra reference to the interp. So it is preserved
+    # and bound to the request until the pool is destroyed. So the cleanup
+    # handler is run only once after Fixup. Hence the counter is 3.
+    $r->push_handlers( PerlMapToStorageHandler=>__PACKAGE__.'::count' );
+    $r->push_handlers( PerlFixupHandler=>__PACKAGE__.'::count' );
+    $r->push_handlers( PerlCleanupHandler=>__PACKAGE__.'::count' );
+    $r->pnotes->{my_pool}=$r->pool->new;
+    $r->push_handlers( PerlFixupHandler=>__PACKAGE__.'::clear_pool' );
+  }
+  return Apache2::Const::DECLINED;
+}
+
+1;
+
+__END__
+# APACHE_TEST_CONFIG_ORDER 942
+
+<VirtualHost TestPerl::ithreads3>
+
+    <IfDefine PERL_USEITHREADS>
+        # a new interpreter pool
+        PerlOptions +Parent
+        PerlInterpStart         3
+        PerlInterpMax           3
+        PerlInterpMinSpare      1
+        PerlInterpMaxSpare      3
+        PerlInterpScope         handler
+    </IfDefine>
+
+    # use test system's @INC
+    PerlSwitches [EMAIL PROTECTED]@
+    PerlRequire "conf/modperl_inc.pl"
+    PerlModule TestPerl::ithreads3
+
+    <Location /modperl>
+        SetHandler modperl
+        PerlResponseHandler TestPerl::ithreads3::response
+    </Location>
+
+    <Location /perl-script>
+        SetHandler perl-script
+        PerlResponseHandler TestPerl::ithreads3::response
+    </Location>
+
+    PerlTransHandler TestPerl::ithreads3::trans
+
+</VirtualHost>


Reply via email to