From: Jeff Trawick Date: Wed, 30 Sep 2009 20:00:37 +0000 (+0000) Subject: change the callable functions in the mod_watchdog API X-Git-Tag: 2.3.3~238 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e054fa7183a07f7ef3eb6e1cbc20aa3bbffda629;p=apache change the callable functions in the mod_watchdog API to optional hooks to avoid module ordering or other symbol resolution issues; affected: ap_watchdog_get_instance ap_watchdog_register_callback ap_watchdog_set_callback_interval git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@820427 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/cluster/mod_heartmonitor.c b/modules/cluster/mod_heartmonitor.c index 452c63c801..9933ca77de 100644 --- a/modules/cluster/mod_heartmonitor.c +++ b/modules/cluster/mod_heartmonitor.c @@ -669,7 +669,16 @@ static int hm_post_config(apr_pool_t *p, apr_pool_t *plog, void *data; hm_ctx_t *ctx = ap_get_module_config(s->module_config, &heartmonitor_module); - + APR_OPTIONAL_FN_TYPE(ap_watchdog_get_instance) *hm_watchdog_get_instance; + APR_OPTIONAL_FN_TYPE(ap_watchdog_register_callback) *hm_watchdog_register_callback; + + hm_watchdog_get_instance = APR_RETRIEVE_OPTIONAL_FN(ap_watchdog_get_instance); + hm_watchdog_register_callback = APR_RETRIEVE_OPTIONAL_FN(ap_watchdog_register_callback); + if (!hm_watchdog_get_instance || !hm_watchdog_register_callback) { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, + "Heartmonitor: mod_watchdog is required"); + return !OK; + } /* Create the slotmem */ apr_pool_userdata_get(&data, userdata_key, s->process->pool); @@ -694,7 +703,7 @@ static int hm_post_config(apr_pool_t *p, apr_pool_t *plog, if (!ctx->active) { return OK; } - rv = ap_watchdog_get_instance(&ctx->watchdog, + rv = hm_watchdog_get_instance(&ctx->watchdog, HM_WATHCHDOG_NAME, 0, 1, p); if (rv) { @@ -704,7 +713,7 @@ static int hm_post_config(apr_pool_t *p, apr_pool_t *plog, return !OK; } /* Register a callback with zero interval. */ - rv = ap_watchdog_register_callback(ctx->watchdog, + rv = hm_watchdog_register_callback(ctx->watchdog, 0, ctx, hm_watchdog_callback); diff --git a/modules/core/mod_watchdog.c b/modules/core/mod_watchdog.c index 838171b098..a7f9b621e9 100644 --- a/modules/core/mod_watchdog.c +++ b/modules/core/mod_watchdog.c @@ -300,11 +300,11 @@ static apr_status_t wd_startup(ap_watchdog_t *w, apr_pool_t *p) return rc; } -AP_WD_DECLARE(apr_status_t) ap_watchdog_get_instance(ap_watchdog_t **watchdog, - const char *name, - int parent, - int singleton, - apr_pool_t *p) +static apr_status_t ap_watchdog_get_instance(ap_watchdog_t **watchdog, + const char *name, + int parent, + int singleton, + apr_pool_t *p) { ap_watchdog_t *w; const char *pver = parent ? AP_WATCHODG_PVERSION : AP_WATCHODG_CVERSION; @@ -330,10 +330,10 @@ AP_WD_DECLARE(apr_status_t) ap_watchdog_get_instance(ap_watchdog_t **watchdog, pver, *watchdog); } -AP_WD_DECLARE(apr_status_t) ap_watchdog_set_callback_interval(ap_watchdog_t *w, - apr_interval_time_t interval, - const void *data, - ap_watchdog_callback_fn_t *callback) +static apr_status_t ap_watchdog_set_callback_interval(ap_watchdog_t *w, + apr_interval_time_t interval, + const void *data, + ap_watchdog_callback_fn_t *callback) { watchdog_list_t *c = w->callbacks; apr_status_t rv = APR_EOF; @@ -355,10 +355,10 @@ AP_WD_DECLARE(apr_status_t) ap_watchdog_set_callback_interval(ap_watchdog_t *w, return rv; } -AP_WD_DECLARE(apr_status_t) ap_watchdog_register_callback(ap_watchdog_t *w, - apr_interval_time_t interval, - const void *data, - ap_watchdog_callback_fn_t *callback) +static apr_status_t ap_watchdog_register_callback(ap_watchdog_t *w, + apr_interval_time_t interval, + const void *data, + ap_watchdog_callback_fn_t *callback) { watchdog_list_t *c = w->callbacks; @@ -718,6 +718,9 @@ static void wd_register_hooks(apr_pool_t *p) NULL, APR_HOOK_MIDDLE); + APR_REGISTER_OPTIONAL_FN(ap_watchdog_get_instance); + APR_REGISTER_OPTIONAL_FN(ap_watchdog_register_callback); + APR_REGISTER_OPTIONAL_FN(ap_watchdog_set_callback_interval); } /*--------------------------------------------------------------------------*/ diff --git a/modules/core/mod_watchdog.h b/modules/core/mod_watchdog.h index a86de29831..540048161e 100644 --- a/modules/core/mod_watchdog.h +++ b/modules/core/mod_watchdog.h @@ -37,6 +37,7 @@ #include "apr_shm.h" #include "apr_hash.h" #include "apr_hooks.h" +#include "apr_optional.h" #include "apr_file_io.h" #include "apr_time.h" #include "apr_thread_proc.h" @@ -131,11 +132,9 @@ typedef apr_status_t ap_watchdog_callback_fn_t(int state, void *data, * and function will create a new watchdog instance. * Note that default client process watchdog works in singleton mode. */ -AP_WD_DECLARE(apr_status_t) ap_watchdog_get_instance(ap_watchdog_t **watchdog, - const char *name, - int parent, - int singleton, - apr_pool_t *p); +APR_DECLARE_OPTIONAL_FN(apr_status_t, ap_watchdog_get_instance, + (ap_watchdog_t **watchdog, const char *name, int parent, + int singleton, apr_pool_t *p)); /** * Register watchdog callback. @@ -145,10 +144,9 @@ AP_WD_DECLARE(apr_status_t) ap_watchdog_get_instance(ap_watchdog_t **watchdog, * @param data The data to pass to the callback function. * @return APR_SUCCESS if all went well. APR_EEXIST if already registered. */ -AP_WD_DECLARE(apr_status_t) ap_watchdog_register_callback(ap_watchdog_t *watchdog, - apr_interval_time_t interval, - const void *data, - ap_watchdog_callback_fn_t *callback); +APR_DECLARE_OPTIONAL_FN(apr_status_t, ap_watchdog_register_callback, + (ap_watchdog_t *watchdog, apr_interval_time_t interval, + const void *data, ap_watchdog_callback_fn_t *callback)); /** * Update registered watchdog callback interval. @@ -158,10 +156,9 @@ AP_WD_DECLARE(apr_status_t) ap_watchdog_register_callback(ap_watchdog_t *watchdo * @param data The data to pass to the callback function. * @return APR_SUCCESS if all went well. APR_EOF if callback was not found. */ -AP_WD_DECLARE(apr_status_t) ap_watchdog_set_callback_interval(ap_watchdog_t *w, - apr_interval_time_t interval, - const void *data, - ap_watchdog_callback_fn_t *callback); +APR_DECLARE_OPTIONAL_FN(apr_status_t, ap_watchdog_set_callback_interval, + (ap_watchdog_t *w, apr_interval_time_t interval, + const void *data, ap_watchdog_callback_fn_t *callback)); /** * Watchdog require hook.