Mailing List Archive

Re: svn commit: r1916926 - in /httpd/httpd/trunk: changes-entries/worker_exit.txt server/mpm/worker/worker.c
On 4/12/24 1:02 PM, ylavic@apache.org wrote:
> Author: ylavic
> Date: Fri Apr 12 11:02:31 2024
> New Revision: 1916926
>
> URL: http://svn.apache.org/viewvc?rev=1916926&view=rev
> Log:
> mpm_worker: Fix AH00045 about children processes not terminating timely.
>
> * server/mpm/worker/worker.c(setup_threads_runtime):
> Create pollset with APR_POLLSET_WAKEABLE to be able to wake up the listener
> when stopping.
>
> * server/mpm/worker/worker.c(wakeup_listener):
> Wake up the listener using the wakeup pipe (apr_pollset_wakeup).
>
> * server/mpm/worker/worker.c(join_workers):
> Like mpm_event, don't depend on `pthread_kill(listener_thread, 0)` to check
> whether the listener has exited (this does not work on some systems), but use
> the "dying" global variable instead which is set by the listener just before
> exiting.
>
>
> Added:
> httpd/httpd/trunk/changes-entries/worker_exit.txt
> Modified:
> httpd/httpd/trunk/server/mpm/worker/worker.c
>

> Modified: httpd/httpd/trunk/server/mpm/worker/worker.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/worker.c?rev=1916926&r1=1916925&r2=1916926&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/mpm/worker/worker.c (original)
> +++ httpd/httpd/trunk/server/mpm/worker/worker.c Fri Apr 12 11:02:31 2024

> @@ -903,8 +910,17 @@ static void setup_threads_runtime(void)
> }
>
> /* Create the main pollset */
> - rv = apr_pollset_create(&worker_pollset, num_listensocks, pruntime,
> - APR_POLLSET_NOCOPY);
> + pollset_flags = APR_POLLSET_NOCOPY | APR_POLLSET_WAKEABLE;
> + rv = apr_pollset_create(&worker_pollset, num_listensocks + 1, pruntime,

Small comment in the code would be good why we need the +1 above.

> + pollset_flags);
> + if (rv == APR_SUCCESS) {
> + listener_is_wakeable = 1;
> + }
> + else {
> + pollset_flags &= ~APR_POLLSET_WAKEABLE;
> + rv = apr_pollset_create(&worker_pollset, num_listensocks, pruntime,
> + pollset_flags);
> + }
> if (rv != APR_SUCCESS) {
> ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, APLOGNO(03285)
> "Couldn't create pollset in thread;"

Regards

RĂ¼diger