Please review the changes I uploaded to github.  https://github.com/rcaputo/poe 
and https://github.com/rcaputo/poe-test-loops ... thanks!

-- 
Rocco Caputo <rcap...@pobox.com>

On Dec 11, 2011, at 15:05, Rocco Caputo wrote:

> If you're using sig(CHLD => $event) to catch SIGCHLD, you should totally be 
> using sig_child(PID => $event) instead.  sig(CHLD => $event) has problems 
> that are going to be exacerbated by the next POE release.
> 
> Currently POE::Kernel->run() won't return until all child processes have 
> exited.  I added that after a developer reported their production machines 
> were crashing "because of POE".  It turned out they had a slow process leak 
> that didn't cause problems in testing but would kill machines after long 
> production runs.
> 
> Ideally the warning aims developers' guns away from their feet, but in 
> practice there are more people gunning for developers' feet than just 
> themselves.
> 
> I discovered this when Log::Log4perl::Appender::File shot me in the foot 
> recently.  Or maybe I shot my own foot through a level of indirection.  I'm 
> using its pipe mode to send logs through Apache's rotatelogs(8) utility.  The 
> rotatelogs subprocess was deadlocking POE at exit.
> 
> This is POE's fault for being too cautious.  I've modified 
> POE::Resource::Signals' finalization code to warn about running processes but 
> not wait forever for them.
> 
> This broke a few tests that relied on POE::Kernel reaping processes for them. 
>  I'm pretty sure other people will run into this new warning when they 
> upgrade.
> 
> $kernel->sig(CHLD => $event) is a big part of the problem.  It can't tell the 
> difference between processes you want to reap, and ones encapsulated by a 
> library that may never shut them down.
> 
> Which is why I added sig_child() five years ago.
> 
> commit e8a11d981f111afe92e56d6ade8ba08a3d5a077b
> Author: Rocco Caputo <rcap...@cpan.org>
> Date:   Sat Sep 16 05:33:53 2006 -0400
> 
>    Added sig_chlid(), test case, and documentation.  Resolves rt.cpan.org
>    18392.  Collateral damage: POE::Loop::Event's signal handler callbacks
>    have been replaced by POE::Loop::PerlSignals.
> 
> sig_child() can tell the difference.  It can keep a program running until all 
> "interesting" processes are reaped, and it can release the program when 
> they're all done.  You should totally be using that already.  If you aren't, 
> consider this your warning to begin.
> 
> -- 
> Rocco Caputo <ro...@plixer.com>
> 
> -- 
> Rocco Caputo <rcap...@pobox.com>
> 

Reply via email to