From: Mike S. <m...@pe...> - 2004-06-05 17:19:17
|
Kevin Goess wrote on 6/1/2004, 10:55 AM: > The test script runs as expected if you change the END block to > > END{local($?); cleanup()} > > In that case, Tim's script also runs as expected, without the addition > of an additional END block. Sorry for the long wait, Kevin, you are 100% correct, what was I thinking! I've added your local() fix to the patch and the dietest.pl script as in use Log::Log4perl qw(get_logger :levels); Log::Log4perl->init(\q{ log4perl.logger = DEBUG, Mailer log4perl.appender.Mailer = Log::Dispatch::Email::MailSend log4perl.appender.Mailer.to = mschilli@localhost log4perl.appender.Mailer.subject = mysubject log4perl.appender.Mailer.layout = Log::Log4perl::Layout::PatternLayout log4perl.appender.Mailer.layout.ConversionPattern = %m%n }); my $logger = get_logger("foo"); $logger->logdie( "boo" ); now works fine with an exit value of 255. Yay! :) Regarding the mem leak, the 'warn' statements in the patch now show that when running dietest.pl above, one appender is still left over for destruction in the GDP (although it doesn't matter anymore for $?, because its 'meat' is already gone at this point) -- do you have any ideas on how we can track down where it's still referenced from? -- -- Mike Mike Schilli m...@pe... Index: lib/Log/Log4perl.pm =================================================================== RCS file: /cvsroot/log4perl/Log-Log4perl/lib/Log/Log4perl.pm,v retrieving revision 1.164 diff -a -u -r1.164 Log4perl.pm --- lib/Log/Log4perl.pm 28 May 2004 23:41:54 -0000 1.164 +++ lib/Log/Log4perl.pm 5 Jun 2004 17:10:02 -0000 @@ -2,6 +2,9 @@ package Log::Log4perl; ################################################## + # Have this first to execute last +END { local($?); Log::Log4perl::Logger::cleanup(); } + use 5.006; use strict; use warnings; Index: lib/Log/Log4perl/Appender.pm =================================================================== RCS file: /cvsroot/log4perl/Log-Log4perl/lib/Log/Log4perl/Appender.pm,v retrieving revision 1.35 diff -a -u -r1.35 Appender.pm --- lib/Log/Log4perl/Appender.pm 26 Apr 2004 02:41:10 -0000 1.35 +++ lib/Log/Log4perl/Appender.pm 5 Jun 2004 17:10:03 -0000 @@ -260,7 +260,15 @@ ################################################## sub DESTROY { ################################################## - # just there because of AUTOLOAD + # use Data::Dumper; + + warn "Destroying appender $_[0]"; + # warn "app=", Dumper($_[0]), "-"; + + foreach my $key (keys %{$_[0]}) { + # print "deleting $key\n"; + delete $_[0]->{$key}; + } } 1; Index: lib/Log/Log4perl/Logger.pm =================================================================== RCS file: /cvsroot/log4perl/Log-Log4perl/lib/Log/Log4perl/Logger.pm,v retrieving revision 1.60 diff -a -u -r1.60 Logger.pm --- lib/Log/Log4perl/Logger.pm 9 Oct 2003 17:07:11 -0000 1.60 +++ lib/Log/Log4perl/Logger.pm 5 Jun 2004 17:10:04 -0000 @@ -23,6 +23,45 @@ __PACKAGE__->reset(); ################################################## +sub cleanup { +################################################## + # warn "Logger cleanup"; + + # Delete all loggers + foreach my $loggername (keys %$LOGGERS_BY_NAME){ + # warn "Logger delete: $loggername"; + $LOGGERS_BY_NAME->{$loggername}->DESTROY(); + delete $LOGGERS_BY_NAME->{$loggername}; + } + + # Delete the root logger + undef $ROOT_LOGGER; + $LOGGERS_BY_NAME = (); + + # Delete all appenders + foreach my $appendername (keys %APPENDER_BY_NAME){ + if (exists $APPENDER_BY_NAME{$appendername} && + exists $APPENDER_BY_NAME{$appendername}->{appender}) { + # Destroy L4p::Appender + $APPENDER_BY_NAME{$appendername}->DESTROY(); + delete $APPENDER_BY_NAME{$appendername}->{appender}; + delete $APPENDER_BY_NAME{$appendername}; + } + } + %APPENDER_BY_NAME = (); +} + +################################################## +sub DESTROY { +################################################## + warn "Destroying logger $_[0]"; + + for(keys %{$_[0]}) { + delete $_[0]->{$_}; + } +} + +################################################## sub reset { ################################################## $ROOT_LOGGER = __PACKAGE__->_new("", $DEBUG); |