On 6/17/22 11:24 AM, ic...@apache.org wrote:
> Author: icing
> Date: Fri Jun 17 09:24:57 2022
> New Revision: 1902005
> 
> URL: http://svn.apache.org/viewvc?rev=1902005&view=rev
> Log:
>   *) mod_http2: new implementation of h2 worker pool.
>      - O(1) cost at registration of connection processing producers
>      - no limit on registered producers
>      - join of ongoing work on unregister
>      - callbacks to unlink dependencies into other h2 code
>      - memory cleanup on workers deactivation (on idle timeouts)
>      - idle_limit as apr_time_t instead of seconds
> 
> 
> Modified:
>     httpd/httpd/trunk/modules/http2/h2_c1.c
>     httpd/httpd/trunk/modules/http2/h2_config.c
>     httpd/httpd/trunk/modules/http2/h2_config.h
>     httpd/httpd/trunk/modules/http2/h2_mplx.c
>     httpd/httpd/trunk/modules/http2/h2_mplx.h
>     httpd/httpd/trunk/modules/http2/h2_workers.c
>     httpd/httpd/trunk/modules/http2/h2_workers.h
>     httpd/httpd/trunk/modules/http2/mod_http2.c

> Modified: httpd/httpd/trunk/modules/http2/h2_workers.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_workers.c?rev=1902005&r1=1902004&r2=1902005&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/http2/h2_workers.c (original)
> +++ httpd/httpd/trunk/modules/http2/h2_workers.c Fri Jun 17 09:24:57 2022

>  
> @@ -347,37 +367,47 @@ static apr_status_t workers_pool_cleanup
>      int n, wait_sec = 5;

Should n be initialized to 0 to avoid

‘n’ may be used uninitialized in this function

?

>  
>      ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, workers->s,
> -                 "h2_workers: cleanup %d workers idling",
> -                 (int)apr_atomic_read32(&workers->worker_count));
> -    workers_abort_idle(workers);
> +                 "h2_workers: cleanup %d workers (%d idle)",
> +                 workers->active_slots, workers->idle_slots);
> +    apr_thread_mutex_lock(workers->lock);
> +    workers->shutdown = 1;
> +    workers->aborted = 1;
> +    wake_all_idles(workers);
> +    apr_thread_mutex_unlock(workers->lock);
>  
>      /* wait for all the workers to become zombies and join them.
>       * this gets called after the mpm shuts down and all connections
>       * have either been handled (graceful) or we are forced exiting
>       * (ungrateful). Either way, we show limited patience. */
> -    apr_thread_mutex_lock(workers->lock);
>      end = apr_time_now() + apr_time_from_sec(wait_sec);
> -    while ((n = apr_atomic_read32(&workers->worker_count)) > 0
> -           && apr_time_now() < end) {
> +    while (apr_time_now() < end) {
> +        apr_thread_mutex_lock(workers->lock);
> +        if (!(n = workers->active_slots)) {
> +            apr_thread_mutex_unlock(workers->lock);
> +            break;
> +        }
> +        wake_all_idles(workers);
>          rv = apr_thread_cond_timedwait(workers->all_done, workers->lock, 
> timeout);
> +        apr_thread_mutex_unlock(workers->lock);
> +
>          if (APR_TIMEUP == rv) {
>              ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, workers->s,
> -                         APLOGNO(10290) "h2_workers: waiting for idle 
> workers to close, "
> -                         "still seeing %d workers living",
> -                         apr_atomic_read32(&workers->worker_count));
> -            continue;
> +                         APLOGNO(10290) "h2_workers: waiting for workers to 
> close, "
> +                         "still seeing %d workers (%d idle) living",
> +                         workers->active_slots, workers->idle_slots);
>          }
>      }
>      if (n) {
>          ap_log_error(APLOG_MARK, APLOG_WARNING, 0, workers->s,
> -                     APLOGNO(10291) "h2_workers: cleanup, %d idle workers "
> +                     APLOGNO(10291) "h2_workers: cleanup, %d workers (%d 
> idle) "
>                       "did not exit after %d seconds.",
> -                     n, wait_sec);
> +                     n, workers->idle_slots, wait_sec);
>      }
> -    apr_thread_mutex_unlock(workers->lock);
>      ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, workers->s,
>                   "h2_workers: cleanup all workers terminated");
> +    apr_thread_mutex_lock(workers->lock);
>      join_zombies(workers);
> +    apr_thread_mutex_unlock(workers->lock);
>      ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, workers->s,
>                   "h2_workers: cleanup zombie workers joined");
>  


Regards

Rüdiger

Reply via email to