Thanks for the patch. Tony Cook also helped prevent this from being a penultimate solution by discussing some of the subtler issues.

I've applied the patch as revision 2576. It tests clean here (OSX with Select, Event and IO::Poll; FreeBSD with Tk, Event, Select and IO::Poll).

As Philip mentioned, I plan to make a developer release next week for testing and a production 1.007 release if that goes well. There's never too much testing, so feel free to check out a copy of the repository and begin your own QA procedures.

Thanks!

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


On Jul 19, 2009, at 00:37, Philip Gwyn wrote:

Hello POEers.

This is a heads-up about problems with POE and signals. If you use a signal
handler in POE, you are probably affected.

As of 1.006, POE's event queue manipulation code isn't signal safe. If a signal
occurs while POE is removing an event from the queue (example:
$poe_kernel->remove_alarm( $aid )), there is a chance that POE will remove the wrong element. POE::Queue::XS::Array probably doesn't suffer from this problem. Long running daemons that fork a lot of sub-processes (example: pre-
or post-forking daemons) are highly susceptable to this problem.

What's more, there is a race condition between verifying the queue and calling
select() or poll().

You have probably been affected by this bug, without knowing it. If you have seen mysterious hanging processes, POE events that are going missing or other
heisenbugs, this bug is a prime suspect.

Rather then try patch around the problem, we are going to adopt a "final
solution" :

Semantically, the signal handlers and the main queue are running in different threads. The only robust way to implement threads is share- nothing. This means that the signal handlers have to talk to the main queue via some sort of
conduit like a socket or pipe.

The RT ticket is here :
  https://rt.cpan.org/Ticket/Display.html?id=47966

The second patch implements a signal pipe using POE::Pipe::OneWay, which is
highly portable. The previous unsafe behaviour is available if the
POE_USE_SIGNAL_PIPE=0 env var is set.

The patch has already been tested on Linux (CentOS 4) and Mac OS X against all the POE::Loops that we could install. If possible, it would be very much appreciated if you could test it on your systems. Report here on list or via
RT.

A developer release is planed, to see how much smoke the CPAN testers
release.  Then general CPAN release.

Thank you,

-Leolo




Reply via email to