Loading ...
Sorry, an error occurred while loading the content.

61146Re: Apache::PerlRun - Constant subroutine redefined

Expand Messages
  • David Radunz
    Oct 10, 2004
    • 0 Attachment
      Hey,

      Thanks for your help. I tried using Devel::Unload to see how it works
      and encountered something unexpected. Basically I put the
      'unload_package_xs' call just above the 'flush_namespace' call. Then I
      printed from within the namespace clearing loop (expecting nothing to be
      printed), yet something did get printed..

      Flushing
      Apache::ROOTsmog_2edev_2enetspace_2enet_2eau::client_2dinfo_2dpr::chargespage_2ecgi::qs
      Flushing
      Apache::ROOTsmog_2edev_2enetspace_2enet_2eau::client_2dinfo_2dpr::paymentspage_2ecgi::qs
      Flushing
      Apache::ROOTsmog_2edev_2enetspace_2enet_2eau::client_2dinfo_2dpr::homeadslclientpage_2ecgi::qs

      Which isnt that bad, because the rest of the namespace had been cleared,
      except this lonley scalar - I printed it to see if it contained anything
      and got the following:

      Scalar = SELECT DECODE.... (i wont paste the whole scalar here, its
      basically a huge SQL statement, about 2000 characters).

      Perhaps the scalar was too big to be cleared?

      Cheers,

      DJ


      On Sat, 2004-10-09 at 09:08, Philippe M. Chiasson wrote:
      > Stas Bekman wrote:
      >
      > > David Radunz wrote:
      > >
      > >> Hi All,
      > >>
      > >> I have looked high and low to work out how to avoid the 'Constant
      > >> subroutine redefined' warnings in the error log, followed by the
      > >> 'Prototype missmatch:' error upon subsequent hits to the apache child
      > >> process - but, I have not been able to find an easy solution. The
      > >> warnings are caused by the 'flush_namespace' routine of Apache::PerlRun
      > >> which attempts to reset/nullify everything - including constants. When a
      > >> constant is redefined it causes a warning in the error_log, and when the
      > >> constant gets reset upon the next run of the script the prototype doesnt
      > >> match as its reset incorrectly.
      > >
      > >
      > > David, take a look at the ModPerl::PerlRun which now
      > > http://cvs.apache.org/viewcvs.cgi/modperl-2.0/ModPerl-Registry/lib/ModPerl/RegistryCooker.pm?r1=1.50&r2=1.51&diff_format=h
      > >
      > > uses:
      > > http://perl.apache.org/docs/2.0/api/ModPerl/Util.html#C_unload_package_
      > > which Philippe has just added recently. (you will need the current mp2
      > > cvs to see it at works). It solves all these problems in a much
      > > cleaner way. It's still too new to new to be sure that it doesn't have
      > > side-effects, but once it's proved to be good by users, we can just
      > > port it back to mp1.
      >
      > It's also available as a yet to be released on CPAN module
      > (Devel::Unload) here: http://svn.ectoplasm.org/projects/perl/Devel-Unload/
      >
      > You might just try installing Devel::Unload and plugging it into
      > PerlRun.pm and see if it works
      >
      > (untested patch)
      >
      > Index: lib/Apache/PerlRun.pm
      > ===================================================================
      > RCS file: /home/cvs/modperl/lib/Apache/PerlRun.pm,v
      > retrieving revision 1.41
      > diff -u -I$Id -r1.41 PerlRun.pm
      > --- lib/Apache/PerlRun.pm 8 Mar 2003 04:11:09 -0000 1.41
      > +++ lib/Apache/PerlRun.pm 8 Oct 2004 23:08:02 -0000
      > @@ -118,6 +118,8 @@
      > $_r->clear_rgy_endav;
      > $_r->log_error("Apache::PerlRun->compile") if $Debug && $Debug & 4;
      > Apache->untaint($$eval);
      > + use Devel::Unload;
      > + Devel::Unload::unload_package_xs($pr->namespace);
      > {
      > no strict; #so eval'd code doesn't inherit our bits
      > eval $$eval;
      >
      > > If you want to look at the C code that does that, it's
      > > modperl_package_unload in:
      > > http://cvs.apache.org/viewcvs.cgi/modperl-2.0/src/modules/perl/modperl_util.c?view=markup
      > >
      > >
      --
      David Radunz,
      Developer / Programmer

      Netspace Online Systems Pty Ltd
      Ground Floor, 293 Camberwell Road
      Camberwell, Victoria 3124
      Ph: +613 9811 0087
      Fx: +613 9811 0044
      Mo: +614 0549 9719
      Em: david.radunz@...

      This email and any files transmitted with it are confidential and intended solely for the
      use of the individual or entity to whom they are addressed. Please notify the sender
      immediately by email if you have received this email by mistake and delete this email
      from your system. Please note that any views or opinions presented in this email are solely
      those of the author and do not necessarily represent those of the organisation.
      Finally, the recipient should check this email and any attachments for the presence of
      viruses. The organisation accepts no liability for any damage caused by any virus
      transmitted by this email.


      --
      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
    • Show all 16 messages in this topic