On 4/12/24 1:02 PM, yla...@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

Reply via email to