I have been investigating this problem further. The problem appears to be if any module tries to set an environment variable during the first init run then it will get wiped out by the shutdown of perl. This then means that the during the second init run the environment variable will not exist and therefore the module could possibly fail if it depended on it being in place. I have now recreated this with a simple module of my own.
What I believe is happening ....... The "perl_startup" routine appears to use some of the perl routines to make a copy of the environment, and points the exec process at this new environment. The "perl_startup" routine is run before any of the init routines. The init routines then run and a module set an environment variable. This variable is stored in the new copied environment. After the init processes finish Apache performs the shutdown of the modules to test the restart process. During this phase mod_perl runs the "mp_dso_unload" routine which will shutdown perl. My belief is during this shutdown the new environment is dereferenced, and therefore the environment is set back to the original pointer. What this means is all the environment variables that were set during the first run of the init process are lost. The upshot of this is during the second init run you start with a fresh environment. The reason I am now fairly sure this is the case is if you set the environment variable PERL_DESTRUCT_LEVEL to -1 it forces the "mp_dso_unload" routine NOT to unload perl. This means the new environment is not lost, and both my test module and the IBM module now work as expected. I believe the problem lies somewhere in the "perl_startup" routine where it makes changes to the environment. Possible culprits.... .... perl_clear_env(); mod_perl_pass_env(p, cls); ... ... /* Force the environment to be copied out of its original location above argv[]. This fixes a crash caused when a module called putenv() before any Perl modified the environment - environ would change to a new value, and the check in my_setenv() to duplicate the environment would fail, and then setting some environment value which had a previous value would cause perl to try to free() something from the original env. This crashed free(). */ my_setenv("MODPERL_ENV_FIXUP", "0"); my_setenv("MODPERL_ENV_FIXUP", NULL); Clearly there has been a change in the way perl does some of the environment handling between 5.005 and 5.8+ as both the IBM module and my test module work fine with 5.005. My questions are now 1/ What real effect on the system am I likely to suffer having the PERL_DESTRUCT_LEVEL set to -1 ?? 2/ Does anyone have any background on the "perl_startup" routine with regard to the environment calls, and in particular the part where a forced copy of the environment is made for a previous crash situation ? It seems this "fix" might have a side effect of not allowing any other module to set environment variables during the init phase. Rgds Darren Heather Visit our website at http://www.ubs.com This message contains confidential information and is intended only for the individual named. If you are not the named addressee you should not disseminate, distribute or copy this e-mail. Please notify the sender immediately by e-mail if you have received this e-mail by mistake and delete this e-mail from your system. E-mail transmission cannot be guaranteed to be secure or error-free as information could be intercepted, corrupted, lost, destroyed, arrive late or incomplete, or contain viruses. The sender therefore does not accept liability for any errors or omissions in the contents of this message which arise as a result of e-mail transmission. If verification is required please request a hard-copy version. This message is provided for informational purposes and should not be construed as a solicitation or offer to buy or sell any securities or related financial instruments. -- 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