214 lines
7.3 KiB
C
214 lines
7.3 KiB
C
|
/* Licensed to the Apache Software Foundation (ASF) under one or more
|
||
|
* contributor license agreements. See the NOTICE file distributed with
|
||
|
* this work for additional information regarding copyright ownership.
|
||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||
|
* (the "License"); you may not use this file except in compliance with
|
||
|
* the License. You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
#ifndef MOD_WATCHDOG_H
|
||
|
#define MOD_WATCHDOG_H
|
||
|
|
||
|
/**
|
||
|
* @file mod_watchdog.h
|
||
|
* @brief Watchdog module for Apache
|
||
|
*
|
||
|
* @defgroup MOD_WATCHDOG mod_watchdog
|
||
|
* @ingroup APACHE_MODS
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
#include "httpd.h"
|
||
|
#include "http_config.h"
|
||
|
#include "http_log.h"
|
||
|
#include "ap_provider.h"
|
||
|
|
||
|
#include "apr.h"
|
||
|
#include "apr_strings.h"
|
||
|
#include "apr_pools.h"
|
||
|
#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"
|
||
|
#include "apr_global_mutex.h"
|
||
|
#include "apr_thread_mutex.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
* Default singleton watchdog instance name.
|
||
|
* Singleton watchdog is protected by mutex and
|
||
|
* guaranteed to be run inside a single child process
|
||
|
* at any time.
|
||
|
*/
|
||
|
#define AP_WATCHDOG_SINGLETON "_singleton_"
|
||
|
|
||
|
/**
|
||
|
* Default watchdog instance name
|
||
|
*/
|
||
|
#define AP_WATCHDOG_DEFAULT "_default_"
|
||
|
|
||
|
/**
|
||
|
* Default Watchdog interval
|
||
|
*/
|
||
|
#define AP_WD_TM_INTERVAL APR_TIME_C(1000000) /* 1 second */
|
||
|
|
||
|
/**
|
||
|
* Watchdog thread timer resolution
|
||
|
*/
|
||
|
#define AP_WD_TM_SLICE APR_TIME_C(100000) /* 100 ms */
|
||
|
|
||
|
/* State values for callback */
|
||
|
#define AP_WATCHDOG_STATE_STARTING 1
|
||
|
#define AP_WATCHDOG_STATE_RUNNING 2
|
||
|
#define AP_WATCHDOG_STATE_STOPPING 3
|
||
|
|
||
|
typedef struct ap_watchdog_t ap_watchdog_t;
|
||
|
|
||
|
/* Create a set of AP_WD_DECLARE(type), AP_WD_DECLARE_NONSTD(type) and
|
||
|
* AP_WD_DECLARE_DATA with appropriate export and import tags for the platform
|
||
|
*/
|
||
|
#if !defined(AP_WD_DECLARE)
|
||
|
#if !defined(WIN32)
|
||
|
#define AP_WD_DECLARE(type) type
|
||
|
#define AP_WD_DECLARE_NONSTD(type) type
|
||
|
#define AP_WD_DECLARE_DATA
|
||
|
#elif defined(AP_WD_DECLARE_STATIC)
|
||
|
#define AP_WD_DECLARE(type) type __stdcall
|
||
|
#define AP_WD_DECLARE_NONSTD(type) type
|
||
|
#define AP_WD_DECLARE_DATA
|
||
|
#elif defined(AP_WD_DECLARE_EXPORT)
|
||
|
#define AP_WD_DECLARE(type) __declspec(dllexport) type __stdcall
|
||
|
#define AP_WD_DECLARE_NONSTD(type) __declspec(dllexport) type
|
||
|
#define AP_WD_DECLARE_DATA __declspec(dllexport)
|
||
|
#else
|
||
|
#define AP_WD_DECLARE(type) __declspec(dllimport) type __stdcall
|
||
|
#define AP_WD_DECLARE_NONSTD(type) __declspec(dllimport) type
|
||
|
#define AP_WD_DECLARE_DATA __declspec(dllimport)
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
* Callback function used for watchdog.
|
||
|
* @param state Watchdog state function. See @p AP_WATCHDOG_STATE_ .
|
||
|
* @param data is what was passed to @p ap_watchdog_register_callback function.
|
||
|
* @param pool Temporary callback pool destroyed after the call.
|
||
|
* @return APR_SUCCESS to continue calling this callback.
|
||
|
*/
|
||
|
typedef apr_status_t ap_watchdog_callback_fn_t(int state, void *data,
|
||
|
apr_pool_t *pool);
|
||
|
|
||
|
/**
|
||
|
* Get watchdog instance.
|
||
|
* @param watchdog Storage for watchdog instance.
|
||
|
* @param name Watchdog name.
|
||
|
* @param parent Non-zero to get the parent process watchdog instance.
|
||
|
* @param singleton Non-zero to get the singleton watchdog instance.
|
||
|
* @param p The pool to use.
|
||
|
* @return APR_SUCCESS if all went well
|
||
|
* @remark Use @p AP_WATCHDOG_DEFAULT to get default watchdog instance.
|
||
|
* If separate watchdog thread is needed provide unique name
|
||
|
* and function will create a new watchdog instance.
|
||
|
* Note that default client process watchdog works in singleton mode.
|
||
|
*/
|
||
|
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.
|
||
|
* @param watchdog Watchdog to use
|
||
|
* @param interval Interval on which the callback function will execute.
|
||
|
* @param callback The function to call on watchdog event.
|
||
|
* @param data The data to pass to the callback function.
|
||
|
* @return APR_SUCCESS if all went well. APR_EEXIST if already registered.
|
||
|
*/
|
||
|
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.
|
||
|
* @param w Watchdog to use
|
||
|
* @param interval New interval on which the callback function will execute.
|
||
|
* @param callback The function to call on watchdog event.
|
||
|
* @param data The data to pass to the callback function.
|
||
|
* @return APR_SUCCESS if all went well. APR_EOF if callback was not found.
|
||
|
*/
|
||
|
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.
|
||
|
* @param s The server record
|
||
|
* @param name Watchdog name.
|
||
|
* @param parent Non-zero to indicate the parent process watchdog mode.
|
||
|
* @param singleton Non-zero to indicate the singleton watchdog mode.
|
||
|
* @return OK to enable notifications from this watchdog, DECLINED otherwise.
|
||
|
* @remark This is called in post config phase for all watchdog instances
|
||
|
* that have no callbacks registered. Modules using this hook
|
||
|
* should ensure that their post_config hook is called after watchdog
|
||
|
* post_config.
|
||
|
*/
|
||
|
APR_DECLARE_EXTERNAL_HOOK(ap, AP_WD, int, watchdog_need, (server_rec *s,
|
||
|
const char *name,
|
||
|
int parent, int singleton))
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Watchdog initialize hook.
|
||
|
* It is called after the watchdog thread is initialized.
|
||
|
* @param s The server record
|
||
|
* @param name Watchdog name.
|
||
|
* @param pool The pool used to create the watchdog.
|
||
|
*/
|
||
|
APR_DECLARE_EXTERNAL_HOOK(ap, AP_WD, int, watchdog_init, (
|
||
|
server_rec *s,
|
||
|
const char *name,
|
||
|
apr_pool_t *pool))
|
||
|
|
||
|
/**
|
||
|
* Watchdog terminate hook.
|
||
|
* It is called when the watchdog thread is terminated.
|
||
|
* @param s The server record
|
||
|
* @param name Watchdog name.
|
||
|
* @param pool The pool used to create the watchdog.
|
||
|
*/
|
||
|
APR_DECLARE_EXTERNAL_HOOK(ap, AP_WD, int, watchdog_exit, (
|
||
|
server_rec *s,
|
||
|
const char *name,
|
||
|
apr_pool_t *pool))
|
||
|
|
||
|
/**
|
||
|
* Fixed interval watchdog hook.
|
||
|
* It is called regularly on @p AP_WD_TM_INTERVAL interval.
|
||
|
* @param s The server record
|
||
|
* @param name Watchdog name.
|
||
|
* @param pool Temporary pool destroyed after the call.
|
||
|
*/
|
||
|
APR_DECLARE_EXTERNAL_HOOK(ap, AP_WD, int, watchdog_step, (
|
||
|
server_rec *s,
|
||
|
const char *name,
|
||
|
apr_pool_t *pool))
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* MOD_WATCHDOG_H */
|
||
|
/** @} */
|