Jeff Trawick wrote:
[...]
1) what would be the best place to document that in the Apache docs (mpm
include/ap_mpm.h or should each mpm have it documented separately?


how about at

http://httpd.apache.org/docs-2.0/developer/
-> http://httpd.apache.org/docs-2.0/developer/thread_safety.html

That already points out some generic thread safety information.  The
inappropriateness of the alarm()/SIGALRM idiom is another piece of
such information.

Sounds good, but let's polish here first what we want to add.

2) what's the policy on non-threaded mpms, i.e. which signals are declared
usable in the user code (i.e. declare an API so one could rely on it)


We can have a small section on signals in that document to point out
that typical signal use is not thread-safe, and that modules which
rely on signals may not work portably.  A good example would be a
module which uses alarm() and happens to work with the prefork MPM on
Unix but does not work with any other MPM or platform.

Agreed.

As far as explicitly laying out what sort of signal usage will work in
which MPMs:
(a) I'm not sure we can do an accurate job without spending a lot of
effort, and then we're tied to trying to make whatever we document
work forever and ever
(b) we wouldn't want to promote such practices anyway

Understood.

Thanks Jeff for the detailed explanation!

So here is the proposed addition to the
http://httpd.apache.org/docs-2.0/developer/thread_safety.html
doc, based on your input, Jeff:

<IN>
----------------------------------------
Usage of signals outside the httpd core:
----------------------------------------

3rd party Apache 2 modules should avoid using code relying on signals. This is because typical signal use is not thread-safe and modules which
rely on signals may not work portably. Certain signals may still work for non-threaded mpms. For example alarm() can be used under prefork MPM, but it won't work on any other MPM. Moreover Apache can't guarantee that the signals that currently happen to work will continue to do so in the future Apache releases. So use them at your own risk.


It should be possible to rework the code using signals to use an alternative solution, which works under threads. For example if you were using alarm() to trap potentially long running I/O, you can modify the I/O logic for select/poll usage (or if you use APR I/O then set timeouts on the apr pipes or sockets). Apache 2.0 switched from the magic, thread-unsafe mechanism of having the parent send SIGALRM when the child didn't update a timeout field in the scoreboard for a "long time" to the explicit thread-safe mechanism of using select()/poll() on I/O.

CPU timeout handling is another example. It can be accomplished by modifying the computation logic to explicitly check for the timeout at intervals.

Alternatively one could use a manager thread that implements
something like a thread-specific alarm(), where a signal handler
running on the interrupted thread does siglongjmp() to break out of
the interrupted processing, but implementing that sort of service is
not trivial.
<OUT>


-- __________________________________________________________________ Stas Bekman JAm_pH ------> Just Another mod_perl Hacker http://stason.org/ mod_perl Guide ---> http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com

Reply via email to