Alexander Bergolth wrote:
When I'm using the request-object in a subroutine without having passed
it to the sub as a parameter, the apache child processes die with a segmentation fault when being reused.
Well, it probably shouldn't segfault, but you can't do that. You are creating a closure which will permanently keep a copy of the very first $r that existed in that process, but $r is really an apache structure that gets freed after each request. If you need a copy of $r but don't want to pass it, and you are running in pre-fork MPM, you can use the Apache->request() call.
Why do I create a closure? If i'd create a closure I would have to store a reference to an _anonymous sub, something like that:
---------- snipp! ---------- my $r = shift;
my $printline3 = sub {
$r->print($_[0]."<br>\n");
}&$printline3("Uses frozen request variable.");
---------- snipp! ----------
( See http://www.perldoc.com/perl5.6/pod/perlref.html#4. )My version uses a regular (named-) sub and the scope of the variable $r should be lexically local to the enclosing block. So the value of $r should be the same as in the "main" block, where it is assigned via
"$r = shift;" at every new request. (I've again attached my version below for the sake of completeness.)
Moreover I've read that Apache->request should be avoided in mod_perl2: http://perl.apache.org/docs/2.0/user/porting/compat.html#C_Apache_E_gt_request_
---------- snipp! ---------- #!/usr/bin/perl
use strict;
my $r = shift;
$r->content_type("text/html");
$r->print( "<html>\n"
."<head><title>Testpage</title></head>\n"
."<body>\n" );&printline1($r, "This works");
&printline2("This crashes the httpd process when it is reused");$r->print( "</body>\n"
."</html>\n" );sub printline1 {
my $r = shift;
$r->print($_[0]."<br>\n");
}sub printline2 {
$r->print($_[0]."<br>\n");
}1; ---------- snipp! ----------
Cheers, --leo -- ----------------------------------------------------------------------- Alexander (Leo) Bergolth [EMAIL PROTECTED] WU-Wien - Zentrum fuer Informatikdienste http://leo.wu-wien.ac.at Computers are like air conditioners - they stop working properly when you open Windows
-- Reporting bugs: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html
