This clears things up.

Thanks for your help.

Justin

-----Original Message-----
From: Malcolm J Harwood [mailto:[EMAIL PROTECTED] 
Sent: Friday, November 05, 2004 9:22 AM
To: [EMAIL PROTECTED]
Subject: Re: Global Variables - What is in Memory?

On Friday 5 November 2004 11:50 am, Justin Luster wrote:

> > Apache::Registry should mangle scripts to seperate names so that
they
> > don't conflict. However if you are using the same package name in
each
> > case, the last definition to be loaded will be used. Ie. if both
> > one/MyAdmin.pl and two/MyAdmin.pl define admin:main(), whichever
file
> > loaded last will have it's definition used. (Check your error logs
for
> > "redefinition" warnings).

> I'm still not totally clear on this.

> So if I have two scripts:

> http://www.mysite.com/one/MyAdmin.pl
> and
> http://www.mysite.com/two/MyAdmin.pl

> are you saying that the latest one loaded will be used?  So if 
> http://www.mysite.com/two/MyAdmin.pl was loaded last then
> http://www.mysite.com/one/MyAdmin.pl would actually use the script
> contained in two/MyAdmin.pl?  

No.

> The package part though does make sense.  So the
> last "package" loaded stays in memory?

If you load a file with a package definition in it, then load another
file 
that defines a package with the same name (which is what it looks like
you 
are doing) you get a conflict. If you define a function in both package 
definitions with the same name, then whichever one happens to be loaded
last 
will override the previous definition. Usually this results in a 
"Redefinition of package::functioname " message in your error log.

Normally Apache::Registry only loads packages that are requested using
"use 
package" once (there's a package that will check for changes to package
files 
and reload them if they change, but you have to explicitly use it).

However, you have your package definition in your scripts, which is
where the 
problem occurs. Apache::Registry will load each script when it is first 
encountered or when it changes, and if you are running multiprocess
apache 
then each child will load your scripts in an arbitary order. So some 
processes will have the definition from one/MyAdmin.pl and some from 
two/MyAdmin.pl with no way of predicting which, or which process will
answer 
a given request.


With your scripts, you end up with the following packages being known to

mod_perl:

package Apache::ROOT::webdir::one::MyAdminpl
package Apache::ROOT::webdir::two::MyAdminpl
package mylib
...

one/MyAdmin.pl contains the following package definitions:
package Apache::ROOT::webdir::one::MyAdminpl
package mylib

two/MyAdmin.pl contains the following package definitions:
package Apache::ROOT::webdir::two::MyAdminpl
package mylib

However the two definitions of "mylib" are different. You see the
problem?


-- 
"You heard Mr. Garibaldi. You did the right thing."
"Darling, I did the necessary thing. That is not always the same as
 the right thing."
- Janice and Laura Rosen in Babylon 5:"The Quality of Mercy"

-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html


-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html

Reply via email to