Re: PerlModule hell - questions and comments

2002-03-23 Thread Stas Bekman

Kee Hinckley wrote:
 At 4:18 PM -0500 3/22/02, Perrin Harkins wrote:
 
 Modules loaded with PerlModule and PerlRequire are not supposed to be 
 loaded again the second time.  I seem to remember that they are loaded 
 again when using DSO though, so if you're using DSO you may want to 
 recompile as static.  Also, if you have PerlFreshRestart on that will 
 cause a reload.
 
 
 If all you were doing was loading a normal Perl module, the single load 
 would be fine.  The catch is that in this case we are loading a Perl 
 module which in turn is registering an Apache module.  The Apache module 
 is being *unloaded* prior to the second pass through the config file.  
 The only way that it will be reloaded is if the Perl module is reloaded 
 on the second pass as well.

If all you want to do is to be able to load the module only during the 
restart use in startup.pl:

   if ($Apache::Server::ReStarting) {
   require My::Sensitive::Module;
   }


-- 


__
Stas BekmanJAm_pH -- Just Another mod_perl Hacker
http://stason.org/ mod_perl Guide --- http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com





Re: PerlModule hell - questions and comments

2002-03-23 Thread Kee Hinckley

At 7:04 PM +0800 3/23/02, Stas Bekman wrote:
If all you want to do is to be able to load the module only during 
the restart use in startup.pl:

   if ($Apache::Server::ReStarting) {
   require My::Sensitive::Module;
   }

No, the module has to be loaded during both phases, other wise the 
configuration file syntax extensions it adds won't be loaded.  The 
sequence is:

1. Module loads
2. On load, module registers as an Apache module
3. On the second parse of the config file, apache asks module to unload
4. Perl module unregisters itself
5. Module isn't reloaded (because perl modules get loaded only once)
6. Apache module doesn't get reloaded
7. Config file parse fails with syntax errors

You would think that I could just skip step #4, but as far as I can 
tell that leaves stale pointers around, at least on some 
platforms/configurations.  It also doesn't seem proper in general.

The only work-around I have is to add an perl section that calls 
the initialization manually.  That works, but one would hope that 
Perl modules could be treated as first-class Apache modules with 
extra magic in the config file.

BTW.  I thought that startup.pl was only called once, so your 
suggestion would only work inside a perl directive anyway?
-- 

Kee Hinckley - Somewhere.Com, LLC
http://consulting.somewhere.com/
[EMAIL PROTECTED]

I'm not sure which upsets me more: that people are so unwilling to accept
responsibility for their own actions, or that they are so eager to regulate
everyone else's.



Re: PerlModule hell - questions and comments

2002-03-22 Thread Perrin Harkins

Kee Hinckley wrote: 1. *Why* are the apache config files executed twice (completely 
with 
 loading and unloading all the modules)?

This is a core apache thing.  Apache does it to verify that a restart is 
safe.  See 
http://thingy.kcilink.com/modperlguide/config/Apache_Restarts_Twice_On_Start.html

I'm not saying I think it's the greatest idea, but that's the reason 
behind it.

Modules loaded with PerlModule and PerlRequire are not supposed to be 
loaded again the second time.  I seem to remember that they are loaded 
again when using DSO though, so if you're using DSO you may want to 
recompile as static.  Also, if you have PerlFreshRestart on that will 
cause a reload.

A couple of people reported a bug that they were seeing which caused 
these modules to be loaded twice anyway.  That sounds like the issue you 
saw with Perl sections.  I haven't tested this myself, and fixing it 
would probably require help from Doug.  As a workaround, it is possible 
to do all of your module loading from a startup.pl called from 
PerlRequire, and avoid that problem.  That's what I do.

Of course my goal here sounds like exactly the opposite of yours: you 
actually *want* Embperl to get loaded both times so that your conf 
directives will work.  I haven't run into that problem before because I 
don't use any modules that add conf directives.  Maybe Gerald will have 
an explanation of what the expected behavior is on his end.  It can't be 
this much trouble for most people or no one would be using Embperl or 
custom conf directives.

- Perrin




Re: PerlModule hell - questions and comments

2002-03-22 Thread Kee Hinckley

At 4:18 PM -0500 3/22/02, Perrin Harkins wrote:
Modules loaded with PerlModule and PerlRequire are not supposed to 
be loaded again the second time.  I seem to remember that they are 
loaded again when using DSO though, so if you're using DSO you may 
want to recompile as static.  Also, if you have PerlFreshRestart on 
that will cause a reload.

If all you were doing was loading a normal Perl module, the single 
load would be fine.  The catch is that in this case we are loading a 
Perl module which in turn is registering an Apache module.  The 
Apache module is being *unloaded* prior to the second pass through 
the config file.  The only way that it will be reloaded is if the 
Perl module is reloaded on the second pass as well.

A couple of people reported a bug that they were seeing which caused 
these modules to be loaded twice anyway.  That sounds like the issue 
you saw with Perl sections.  I haven't tested this myself, and 
fixing it would probably require help from Doug.  As a workaround, 
it is possible to do all of your module loading from a startup.pl 
called from PerlRequire, and avoid that problem.  That's what I do.

That doesn't solve the problem because it won't load twice, and the 
Apache module won't get reloaded.

because I don't use any modules that add conf directives.  Maybe 
Gerald will have an explanation of what the expected behavior is on 
his end.  It can't be this much trouble for most people or no one 
would be using Embperl or custom conf directives.

At Embperl 2.0b6 Gerald switched to a new architecture.  The previous 
version was just a plain Perl module loaded as a handler by mod_perl. 
This version is also an Apache module.

Maybe we need an option for PerlModule that forces a load each time?
-- 

Kee Hinckley - Somewhere.Com, LLC
http://consulting.somewhere.com/
[EMAIL PROTECTED]

I'm not sure which upsets me more: that people are so unwilling to accept
responsibility for their own actions, or that they are so eager to regulate
everyone else's.



Re: PerlModule hell - questions and comments

2002-03-22 Thread Perrin Harkins

Kee Hinckley wrote:
 At Embperl 2.0b6 Gerald switched to a new architecture.  The previous 
 version was just a plain Perl module loaded as a handler by mod_perl. 
 This version is also an Apache module.

Okay, if it's only in the recent betas then it's possible that only a 
few people have encountered this.  Can anyone else who has built a 
module with custom conf directives comment on this issue?

 Maybe we need an option for PerlModule that forces a load each time?

It seems like something to keep the C and perl sides doing the same 
thing is what's needed, so that if the C stuff gets unloaded the perl 
stuff will too.

In your case, PerlFreshRestart might help with what you're trying to do 
since it will clear %INC, but you may still have the problem with 
needing to call Init.

- Perrin




Re: PerlModule hell - questions and comments

2002-03-22 Thread Kee Hinckley

At 5:11 PM -0500 3/22/02, Perrin Harkins wrote:
Kee Hinckley wrote:
At Embperl 2.0b6 Gerald switched to a new architecture.  The 
previous version was just a plain Perl module loaded as a handler 
by mod_perl. This version is also an Apache module.

Okay, if it's only in the recent betas then it's possible that only 
a few people have encountered this.  Can anyone else who has built a 
module with custom conf directives comment on this issue?

I should note that it also appears to be at least partially either an 
architecture or configuration issue.  The original code which worked 
for Gerald didn't call unload in its cleanup handler.  However that 
did not work on my system (MacOS X), and on at least one other system 
(Linux).  I found that I had to call unload for things to work, and 
then it wasn't getting it reloaded.  So there may be another way to 
fix the problem.  Suggestions are more than welcome.
-- 

Kee Hinckley - Somewhere.Com, LLC
http://consulting.somewhere.com/
[EMAIL PROTECTED]

I'm not sure which upsets me more: that people are so unwilling to accept
responsibility for their own actions, or that they are so eager to regulate
everyone else's.



Re: PerlModule hell - questions and comments

2002-03-22 Thread Kee Hinckley

At 5:11 PM -0500 3/22/02, Perrin Harkins wrote:
In your case, PerlFreshRestart might help with what you're trying to 
do since it will clear %INC, but you may still have the problem with 
needing to call Init.

PerlFreshRestart will reload the module and thus call Init, but 
PerlFreshRestart is only called when we fork a new process, it is not 
called between the first and second parsing of the config file at 
startup.

That seems like a bug to me.  If reading the config file twice is 
intended to ensure that subsequent re-reads on HUP will work, then 
*everything* should be the same, and that means if PerlFreshRestart 
is set, it ought to happen there as well.

Oddly enough though, PerlFreshRestart is not required for this to 
work after a HUP, even though it would seem to make sense.  Looking 
at my debug output, it appears that -HUP doesn't cause the cleanup 
handlers to be called, so the module is never unloaded.
-- 

Kee Hinckley - Somewhere.Com, LLC
http://consulting.somewhere.com/
[EMAIL PROTECTED]

I'm not sure which upsets me more: that people are so unwilling to accept
responsibility for their own actions, or that they are so eager to regulate
everyone else's.