summaryrefslogtreecommitdiffstats
path: root/httpd-2.4.25-r1787141.patch
blob: 012bc131d5a23d0ccc9a7279e57b5d106b211118 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
diff --git a/modules/http2/h2_workers.c b/modules/http2/h2_workers.c
index 1dcfb2f..cbaf1bc 100644
--- a/modules/http2/h2_workers.c
+++ b/modules/http2/h2_workers.c
@@ -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)
diff --git a/modules/http2/h2_workers.h b/modules/http2/h2_workers.h
index ae7b4d8..b96cff3 100644
--- a/modules/http2/h2_workers.h
+++ b/modules/http2/h2_workers.h
@@ -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