]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mod_watchdog: use a single "wd_running" pool in wd_worker() thread.
authorYann Ylavic <ylavic@apache.org>
Fri, 17 Apr 2020 17:15:51 +0000 (17:15 +0000)
committerYann Ylavic <ylavic@apache.org>
Fri, 17 Apr 2020 17:15:51 +0000 (17:15 +0000)
Clear the pool where appropriate instead of multiple create/destroy.

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

modules/core/mod_watchdog.c

index 1723eeec5106df38bc2bf02fac8904070dbf37b7..e7e05287a03dceb28d986565d44e5c199ed78a0b 100644 (file)
@@ -159,6 +159,10 @@ static void* APR_THREAD_FUNC wd_worker(apr_thread_t *thread, void *data)
             apr_sleep(AP_WD_TM_SLICE);
         }
     }
+
+    apr_pool_create(&temp_pool, w->pool);
+    apr_pool_tag(temp_pool, "wd_running");
+
     if (w->is_running) {
         watchdog_list_t *wl = w->callbacks;
         ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, wd_server_conf->s,
@@ -166,16 +170,13 @@ static void* APR_THREAD_FUNC wd_worker(apr_thread_t *thread, void *data)
                      w->singleton ? "Singleton " : "", w->name);
         apr_time_clock_hires(w->pool);
         if (wl) {
-            apr_pool_create(&temp_pool, w->pool);
-            apr_pool_tag(temp_pool, "wd_running-singleton");
             while (wl && w->is_running) {
                 /* Execute watchdog callback */
                 wl->status = (*wl->callback_fn)(AP_WATCHDOG_STATE_STARTING,
                                                 (void *)wl->data, temp_pool);
                 wl = wl->next;
             }
-            apr_pool_destroy(temp_pool);
-            temp_pool = NULL;
+            apr_pool_clear(temp_pool);
         }
         else {
             ap_run_watchdog_init(wd_server_conf->s, w->name, w->pool);
@@ -203,10 +204,6 @@ static void* APR_THREAD_FUNC wd_worker(apr_thread_t *thread, void *data)
             if (wl->status == APR_SUCCESS) {
                 wl->step += (apr_time_now() - curr);
                 if (wl->step >= wl->interval) {
-                    if (!temp_pool) {
-                        apr_pool_create(&temp_pool, w->pool);
-                        apr_pool_tag(temp_pool, "wd_running-callback");
-                    }
                     wl->step = 0;
                     /* Execute watchdog callback */
                     wl->status = (*wl->callback_fn)(AP_WATCHDOG_STATE_RUNNING,
@@ -227,23 +224,17 @@ static void* APR_THREAD_FUNC wd_worker(apr_thread_t *thread, void *data)
              */
             w->step += (apr_time_now() - curr);
             if (w->step >= wd_interval) {
-                if (!temp_pool) {
-                    apr_pool_create(&temp_pool, w->pool);
-                    apr_pool_tag(temp_pool, "wd_running");
-                }
                 w->step = 0;
                 /* Run watchdog step hook */
                 ap_run_watchdog_step(wd_server_conf->s, w->name, temp_pool);
             }
         }
-        if (temp_pool) {
-            apr_pool_destroy(temp_pool);
-            temp_pool = NULL;
-        }                
-        if (!w->is_running) {
-            break;
-        }
+
+        apr_pool_clear(temp_pool);
     }
+
+    apr_pool_destroy(temp_pool);
+
     if (inited) {
         /* Run the watchdog exit hooks.
          * If this was singleton watchdog the init hook