Hi, in case of a threaded server modperl_response_handler runs this code:
#ifdef USE_ITHREADS
interp = modperl_interp_select(r, r->connection, r->server);
aTHX = interp->perl;
#endif
while modperl_response_handler_cgi runs this:
#ifdef USE_ITHREADS
interp = modperl_interp_select(r, r->connection, r->server);
aTHX = interp->perl;
if (MpInterpPUTBACK(interp)) {
rcfg->interp = interp;
}
#endif
then both call via modperl_response_handler_run and modperl_callback_per_dir
modperl_callback_run_handlers which does then:
#ifdef USE_ITHREADS
if (r && !c && modperl_interp_scope_connection(scfg)) {
c = r->connection;
}
if (r || c) {
interp = modperl_interp_select(r, c, s);
aTHX = interp->perl;
}
else {
/* Child{Init,Exit}, OpenLogs */
aTHX = scfg->mip->parent->perl;
PERL_SET_CONTEXT(aTHX);
}
#endif
This means in both cases modperl_interp_select is called twice but for the
perl-script case rcfg->interp = interp is set.
modperl_interp_select first looks if rcfg->interp is set and returns it. Only
if it's not it looks at other places for an interpreter.
This means a perl-script handler needs 1 interpreter to handle the response
phase while a modperl handler needs 2.
I noticed that with "PerlTrace i". I had installed handlers for Trans,
MapToStorage, Fixup and Response. 2 interpreters were configured.
With a modperl handler I got this:
After Fixup:
modperl_tipool_putback_base: all items idle:
interp_pool_dump: listp==0x9467668, interp==0x8277740, requests=3
interp_pool_dump: listp==0xb78f2a0, interp==0xa3385a0, requests=0
"requests=3" means modperl_interp_select was run 3 times, once for Trans, once
for MapToStorage and once for Fixup.
After Response:
modperl_tipool_putback_base: all items idle:
interp_pool_dump: listp==0x9467668, interp==0x8277740, requests=4
interp_pool_dump: listp==0xb78f2a0, interp==0xa3385a0, requests=1
Now it shows requests=4 for the first interpreter but requests=1 for the 2nd.
I would have expected requests=4 and requests=0.
After scrutinizing the code I tried a perl-script handler and got this output.
After Fixup:
modperl_tipool_putback_base: all items idle:
interp_pool_dump: listp==0xc1235e8, interp==0x87ef068, requests=3
interp_pool_dump: listp==0xa5315e8, interp==0xc7ee558, requests=0
After Response:
modperl_tipool_putback_base: all items idle:
interp_pool_dump: listp==0xc1235e8, interp==0x87ef068, requests=4
interp_pool_dump: listp==0xa5315e8, interp==0xc7ee558, requests=0
This is what I'd have expected.
Torsten
pgpoYCfg6yR64.pgp
Description: PGP signature
