]> granicus.if.org Git - apache/commitdiff
On the trunk:
authorStefan Eissing <icing@apache.org>
Thu, 16 Mar 2017 08:40:52 +0000 (08:40 +0000)
committerStefan Eissing <icing@apache.org>
Thu, 16 Mar 2017 08:40:52 +0000 (08:40 +0000)
mod_http2: fixed PR60869 by making h2 workers exit explicitly waking up
     all threads to exit in a defined way.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1787141 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/http2/h2_workers.c
modules/http2/h2_workers.h

diff --git a/CHANGES b/CHANGES
index bd768316e3ef7eb09096c34dd630f154bf7152bb..e54947a5b591e4bb167152eac2c3ce1acdf041f2 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.0
 
+  *) mod_http2: fixed PR60869 by making h2 workers exit explicitly waking up
+     all threads to exit in a defined way. [Stefan Eissing]
+     
   *) Add <IfDirective> and <IfSection> directives.  [Joe Orton]
 
   *) mod_syslog: Support use of optional "tag" in syslog entries.
index 1dcfb2fcd751f91bdf087013230f3ca426501756..cbaf1bcb36dfed76af7de240f2c6f2bfa758e6c4 100644 (file)
@@ -235,6 +235,28 @@ static apr_status_t h2_workers_start(h2_workers *workers)
     return status;
 }
 
+static apr_status_t workers_pool_cleanup(void *data)
+{
+    h2_workers *workers = data;
+    h2_worker *w;
+    
+    if (!workers->aborted) {
+        workers->aborted = 1;
+
+        /* before we go, cleanup any zombies and abort the rest */
+        cleanup_zombies(workers, 1);
+        w = H2_WORKER_LIST_FIRST(&workers->workers);
+        while (w != H2_WORKER_LIST_SENTINEL(&workers->workers)) {
+            h2_worker_abort(w);
+            w = H2_WORKER_NEXT(w);
+        }
+        apr_thread_mutex_lock(workers->lock);
+        apr_thread_cond_broadcast(workers->mplx_added);
+        apr_thread_mutex_unlock(workers->lock);
+    }
+    return APR_SUCCESS;
+}
+
 h2_workers *h2_workers_create(server_rec *s, apr_pool_t *server_pool,
                               int min_workers, int max_workers,
                               apr_size_t max_tx_handles)
@@ -283,50 +305,20 @@ h2_workers *h2_workers_create(server_rec *s, apr_pool_t *server_pool,
         if (status == APR_SUCCESS) {
             status = apr_thread_cond_create(&workers->mplx_added, workers->pool);
         }
-        
         if (status == APR_SUCCESS) {
             status = apr_thread_mutex_create(&workers->tx_lock,
                                              APR_THREAD_MUTEX_DEFAULT,
                                              workers->pool);
         }
-        
         if (status == APR_SUCCESS) {
             status = h2_workers_start(workers);
         }
-        
-        if (status != APR_SUCCESS) {
-            h2_workers_destroy(workers);
-            workers = NULL;
+        if (status == APR_SUCCESS) {
+            apr_pool_pre_cleanup_register(pool, workers, workers_pool_cleanup);    
+            return workers;
         }
     }
-    return workers;
-}
-
-void h2_workers_destroy(h2_workers *workers)
-{
-    /* before we go, cleanup any zombie workers that may have accumulated */
-    cleanup_zombies(workers, 1);
-    
-    if (workers->mplx_added) {
-        apr_thread_cond_destroy(workers->mplx_added);
-        workers->mplx_added = NULL;
-    }
-    if (workers->lock) {
-        apr_thread_mutex_destroy(workers->lock);
-        workers->lock = NULL;
-    }
-    while (!H2_MPLX_LIST_EMPTY(&workers->mplxs)) {
-        h2_mplx *m = H2_MPLX_LIST_FIRST(&workers->mplxs);
-        H2_MPLX_REMOVE(m);
-    }
-    while (!H2_WORKER_LIST_EMPTY(&workers->workers)) {
-        h2_worker *w = H2_WORKER_LIST_FIRST(&workers->workers);
-        H2_WORKER_REMOVE(w);
-    }
-    if (workers->pool) {
-        apr_pool_destroy(workers->pool);
-        /* workers is gone */
-    }
+    return NULL;
 }
 
 apr_status_t h2_workers_register(h2_workers *workers, struct h2_mplx *m)
index ae7b4d8969f0b714b4dec87517f3c963415bb57f..b96cff3613dfa1032c778fdb329198e81bc26e4d 100644 (file)
@@ -67,10 +67,6 @@ h2_workers *h2_workers_create(server_rec *s, apr_pool_t *pool,
                               int min_size, int max_size, 
                               apr_size_t max_tx_handles);
 
-/* Destroy the worker pool and all its threads. 
- */
-void h2_workers_destroy(h2_workers *workers);
-
 /**
  * Registers a h2_mplx for task scheduling. If this h2_mplx runs
  * out of tasks, it will be automatically be unregistered. Should