File apache2-core-mpm-add-hook-child_stopped-that-gets-called-whe.patch of Package apache2.31342

Backport from upstream - does not increase MAGIC NUMBER in include/ap_mmn.h.

From 2e239ed8e65a0a7cc5f12d64b4d21cc92ab08709 Mon Sep 17 00:00:00 2001
From: Stefan Eissing <icing@apache.org>
Date: Thu, 24 Feb 2022 11:53:53 +0000
Subject: [PATCH]   * core/mpm: add hook 'child_stopped` that gets called when
 the MPM has     stopped all processing in a child process. This is when all
 running     threads shall be stopped and joined.     [Stefan Eissing]

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1898369 13f79535-47bb-0310-9956-ffa450edef68
---
 changes-entries/mpm_child_stopped.txt |  5 +++++
 include/ap_mmn.h                      |  4 +++-
 include/mpm_common.h                  | 20 ++++++++++++++++++--
 server/mpm/event/event.c              |  1 +
 server/mpm/prefork/prefork.c          |  1 +
 server/mpm/winnt/child.c              |  2 ++
 server/mpm/worker/worker.c            |  1 +
 server/mpm_common.c                   |  6 +++++-
 8 files changed, 36 insertions(+), 4 deletions(-)
 create mode 100644 changes-entries/mpm_child_stopped.txt

Index: httpd-2.4.51/changes-entries/mpm_child_stopped.txt
===================================================================
--- /dev/null
+++ httpd-2.4.51/changes-entries/mpm_child_stopped.txt
@@ -0,0 +1,5 @@
+  * core/mpm: add hook 'child_stopped` that gets called when the MPM has
+    stopped all processing in a child process. This is when all running
+    threads shall be stopped and joined.
+    [Stefan Eissing]
+
Index: httpd-2.4.51/include/mpm_common.h
===================================================================
--- httpd-2.4.51.orig/include/mpm_common.h
+++ httpd-2.4.51/include/mpm_common.h
@@ -453,14 +453,30 @@ AP_DECLARE_HOOK(void, resume_connection,
                 (conn_rec *c, request_rec *r))
 
 /**
- * Notification that the child is stopping. If graceful, ongoing
- * requests will be served.
+ * Notification that the child is stopping. No new requests
+ * or other tasks to be started.
+ * If graceful, already started requests/tasks should be
+ * processed normally.
  * @param pchild The child pool
  * @param graceful != 0 iff this is a graceful shutdown.
  */
 AP_DECLARE_HOOK(void, child_stopping,
                 (apr_pool_t *pchild, int graceful))
 
+/**
+ * Notification that the child has stopped processing
+ * requests completely. Any running threads should be
+ * shut down now.
+ * Ideally, when this hook completes, no more threads
+ * are running in the child process.
+ * Note that de-allocation of global resources should
+ * be run via memory pool destroy callback after this.
+ * @param pchild The child pool
+ * @param graceful != 0 iff this is a graceful shutdown.
+ */
+AP_DECLARE_HOOK(void, child_stopped,
+                (apr_pool_t *pchild, int graceful))
+
 /* mutex type string for accept mutex, if any; MPMs should use the
  * same mutex type for ease of configuration
  */
Index: httpd-2.4.51/server/mpm/event/event.c
===================================================================
--- httpd-2.4.51.orig/server/mpm/event/event.c
+++ httpd-2.4.51/server/mpm/event/event.c
@@ -727,6 +727,7 @@ static void clean_child_exit(int code)
     }
 
     if (pchild) {
+        ap_run_child_stopped(pchild, terminate_mode == ST_GRACEFUL);
         apr_pool_destroy(pchild);
     }
 
Index: httpd-2.4.51/server/mpm/prefork/prefork.c
===================================================================
--- httpd-2.4.51.orig/server/mpm/prefork/prefork.c
+++ httpd-2.4.51/server/mpm/prefork/prefork.c
@@ -228,6 +228,7 @@ static void clean_child_exit(int code)
     }
 
     if (pchild) {
+        ap_run_child_stopped(pchild, 0);
         apr_pool_destroy(pchild);
     }
 
Index: httpd-2.4.51/server/mpm/winnt/child.c
===================================================================
--- httpd-2.4.51.orig/server/mpm/winnt/child.c
+++ httpd-2.4.51/server/mpm/winnt/child.c
@@ -1281,6 +1281,8 @@ void child_main(apr_pool_t *pconf, DWORD
     ap_log_error(APLOG_MARK, APLOG_NOTICE, APR_SUCCESS, ap_server_conf, APLOGNO(00364)
                  "Child: All worker threads have exited.");
 
+    ap_run_child_stopped(pchild, graceful_shutdown);
+
     apr_thread_mutex_destroy(child_lock);
     apr_thread_mutex_destroy(qlock);
     CloseHandle(qwait_event);
Index: httpd-2.4.51/server/mpm/worker/worker.c
===================================================================
--- httpd-2.4.51.orig/server/mpm/worker/worker.c
+++ httpd-2.4.51/server/mpm/worker/worker.c
@@ -439,6 +439,7 @@ static void clean_child_exit(int code)
     }
 
     if (pchild) {
+        ap_run_child_stopped(pchild, terminate_mode == ST_GRACEFUL);
         apr_pool_destroy(pchild);
     }
 
Index: httpd-2.4.51/server/mpm_common.c
===================================================================
--- httpd-2.4.51.orig/server/mpm_common.c
+++ httpd-2.4.51/server/mpm_common.c
@@ -73,7 +73,8 @@
     APR_HOOK_LINK(child_status) \
     APR_HOOK_LINK(suspend_connection) \
     APR_HOOK_LINK(resume_connection) \
-    APR_HOOK_LINK(child_stopping)
+    APR_HOOK_LINK(child_stopping) \
+    APR_HOOK_LINK(child_stopped)
 
 #if AP_ENABLE_EXCEPTION_HOOK
 APR_HOOK_STRUCT(
@@ -116,6 +117,9 @@ AP_IMPLEMENT_HOOK_VOID(resume_connection
 AP_IMPLEMENT_HOOK_VOID(child_stopping,
                        (apr_pool_t *pchild, int graceful),
                        (pchild, graceful))
+AP_IMPLEMENT_HOOK_VOID(child_stopped,
+                       (apr_pool_t *pchild, int graceful),
+                       (pchild, graceful))
 
 /* hooks with no args are implemented last, after disabling APR hook probes */
 #if defined(APR_HOOK_PROBES_ENABLED)
openSUSE Build Service is sponsored by