develooper Front page | perl.poe | Postings from December 2011

Warning: Is anyone still using $kernel->sig(CHLD => $event)?

Thread Next
From:
Rocco Caputo
Date:
December 11, 2011 12:06
Subject:
Warning: Is anyone still using $kernel->sig(CHLD => $event)?
Message ID:
45C6CF66-8B50-45B8-A352-89FEAF2AB814@pobox.com
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 <rcaputo@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 <rocco@plixer.com>

-- 
Rocco Caputo <rcaputo@pobox.com>


Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About