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> >