mod_watchdog.h revision 9b3f22245585921d653a10083d862538dc704f56
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder/* Licensed to the Apache Software Foundation (ASF) under one or more
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder * contributor license agreements. See the NOTICE file distributed with
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder * this work for additional information regarding copyright ownership.
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder * The ASF licenses this file to You under the Apache License, Version 2.0
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner * (the "License"); you may not use this file except in compliance with
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * the License. You may obtain a copy of the License at
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski *
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu * http://www.apache.org/licenses/LICENSE-2.0
2eeec5240b424984e3ee26296da1eeab6c6d739eChristian Maeder *
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * Unless required by applicable law or agreed to in writing, software
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * distributed under the License is distributed on an "AS IS" BASIS,
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * See the License for the specific language governing permissions and
0095c7efbddd0ffeed6aaf8ec015346be161d819Till Mossakowski * limitations under the License.
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#ifndef MOD_WATCHDOG_H
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#define MOD_WATCHDOG_H
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder/**
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @file mod_watchdog.h
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @brief Watchdog module for Apache
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder *
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @defgroup MOD_WATCHDOG watchdog
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @ingroup APACHE_MODS
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @{
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "httpd.h"
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder#include "http_config.h"
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder#include "http_log.h"
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder#include "ap_provider.h"
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder#include "apr.h"
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder#include "apr_strings.h"
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#include "apr_pools.h"
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#include "apr_shm.h"
d3c9318c22fcf44d9135a3b2c64f880b9a785babChristian Maeder#include "apr_hash.h"
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder#include "apr_hooks.h"
f5e43c6208179131e179f075248880a8cae1e111cmaeder#include "apr_file_io.h"
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "apr_time.h"
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "apr_thread_proc.h"
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "apr_global_mutex.h"
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "apr_thread_mutex.h"
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#ifdef AP_NEED_SET_MUTEX_PERMS
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder#include "unixd.h"
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#endif
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder#if APR_HAVE_UNISTD_H
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder#include <unistd.h> /* for getpid() */
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder#endif
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder#ifdef __cplusplus
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maederextern "C" {
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder#endif
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder/**
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * Default singleton watchdog instance name.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * Singleton watchdog is protected by mutex and
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * guaranteed to be run inside a single child process
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * at any time.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#define AP_WATCHDOG_SINGLETON "_singleton_"
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski/**
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * Default watchdog instance name
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder */
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#define AP_WATCHDOG_DEFAULT "_default_"
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder/**
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * Default Watchdog interval
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder */
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder#define AP_WD_TM_INTERVAL APR_TIME_C(1000000) /* 1 second */
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder/**
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * Watchdog thread timer resolution
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#define AP_WD_TM_SLICE APR_TIME_C(100000) /* 100 ms */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder/* State values for callback */
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder#define AP_WATCHDOG_STATE_STARTING 1
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder#define AP_WATCHDOG_STATE_RUNNING 2
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#define AP_WATCHDOG_STATE_STOPPING 3
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowskitypedef struct ap_watchdog_t ap_watchdog_t;
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder/* Create a set of AP_WD_DECLARE(type), AP_WD_DECLARE_NONSTD(type) and
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder * AP_WD_DECLARE_DATA with appropriate export and import tags for the platform
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#if !defined(WIN32)
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#define AP_WD_DECLARE(type) type
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#define AP_WD_DECLARE_NONSTD(type) type
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#define AP_WD_DECLARE_DATA
4ef5e33657aae95850b7e6941f67ac1fb73cd13fChristian Maeder#elif defined(AP_WD_DECLARE_STATIC)
4ef5e33657aae95850b7e6941f67ac1fb73cd13fChristian Maeder#define AP_WD_DECLARE(type) type __stdcall
4ef5e33657aae95850b7e6941f67ac1fb73cd13fChristian Maeder#define AP_WD_DECLARE_NONSTD(type) type
e7d2b3903c7b44db432538b0d720c21062c24823Christian Maeder#define AP_WD_DECLARE_DATA
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#elif defined(AP_WD_DECLARE_EXPORT)
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#define AP_WD_DECLARE(type) __declspec(dllexport) type __stdcall
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#define AP_WD_DECLARE_NONSTD(type) __declspec(dllexport) type
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#define AP_WD_DECLARE_DATA __declspec(dllexport)
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#else
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#define AP_WD_DECLARE(type) __declspec(dllimport) type __stdcall
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#define AP_WD_DECLARE_NONSTD(type) __declspec(dllimport) type
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#define AP_WD_DECLARE_DATA __declspec(dllimport)
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#endif
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder/**
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * Callback function used for watchdog.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @param state Watchdog state function. See AP_WATCHODG_STATE_ .
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @param data is what was passed to @ap_watchdog_register_callback function.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @param pool Temporary callback pool destroyed after the call.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @return APR_SUCCESS to continue calling this callback.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder */
a98fd29a06e80e447af26d898044c23497adbc73Mihai Codescutypedef apr_status_t ap_watchdog_callback_fn_t(int state, void *data,
a98fd29a06e80e447af26d898044c23497adbc73Mihai Codescu apr_pool_t *pool);
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski/**
e7d2b3903c7b44db432538b0d720c21062c24823Christian Maeder * Get watchdog instance.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @param watchdog Storage for watchdog instance.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @param name Watchdog name.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @param parent Non zero to get the parent process watchdog instance.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @param singleton Non zero to get the singleton watchdog instance.
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder * @param pool The pool use.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @return APR_SUCCESS if all went well
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * @remark Use @AP_WATCHDOG_DEFAULT to get default watchdog instance.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * If separate watchdog thread is needed provide unique name
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * and function will create a new watchdog instance.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * Note that default client process watchdog works in singleton mode.
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till MossakowskiAP_WD_DECLARE(apr_status_t) ap_watchdog_get_instance(ap_watchdog_t **watchdog,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder const char *name,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski int parent,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder int singleton,
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski apr_pool_t *p);
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski/**
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski * Register watchdog callback.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @param watchdog Watchdog to use
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * @param interval Interval on which the callback function will execute.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @param callback The function to call on watchdog event.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @param data The data to pass to the callback function.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @return APR_SUCCESS if all went well. APR_EEXIST if already registered.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder */
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von SchroederAP_WD_DECLARE(apr_status_t) ap_watchdog_register_callback(ap_watchdog_t *watchdog,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder apr_interval_time_t interval,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder const void *data,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder ap_watchdog_callback_fn_t *callback);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder/**
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * Update registered watchdog callback interval.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * @param watchdog Watchdog to use
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * @param interval New interval on which the callback function will execute.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * @param callback The function to call on watchdog event.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * @param data The data to pass to the callback function.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * @return APR_SUCCESS if all went well. APR_EOF if callback was not found.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder */
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von SchroederAP_WD_DECLARE(apr_status_t) ap_watchdog_set_callback_interval(ap_watchdog_t *w,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder apr_interval_time_t interval,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder const void *data,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder ap_watchdog_callback_fn_t *callback);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder/**
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * Watchdog require hook.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * @param name Watchdog name.
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * @param parent Non zero to indicate the parent process watchdog mode.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @param singleton Non zero to indicate the singleton watchdog mode.
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder * @param pool The pool used to create the watchdog.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @return OK to enable notifications from this watchdog, DECLINED otherwise.
c911a0ec80ca4a178399c68f1e28be4e2bf42fceChristian Maeder * @remark This is called in post config phase for all watchdog instances
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * that have no callbacks registered. Modules using this hook
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder * should ensure their post_config hook is called after watchdog
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder * post_config.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder */
09b431a868c79a92ae7c9bd141565f43f9034144Christian MaederAPR_DECLARE_EXTERNAL_HOOK(ap, AP_WD, int, watchdog_need, (server_rec *s,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder const char *name,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder int parent, int singleton))
c8117ae0b6088d835211e494aef229558c814bd3cmaeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder/**
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * Watchdog initialize hook.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * It is called after the watchog thread is initialized.
c8117ae0b6088d835211e494aef229558c814bd3cmaeder * @param name Watchdog name.
a65c6747c9acbbebc93baba7bae94d2e3d8cdafbTill Mossakowski * @param pool The pool used to create the watchdog.
4d7d53fec6b551333c79da6ae3b8ca2af0a741abChristian Maeder */
09b431a868c79a92ae7c9bd141565f43f9034144Christian MaederAPR_DECLARE_EXTERNAL_HOOK(ap, AP_WD, int, watchdog_init, (
c911a0ec80ca4a178399c68f1e28be4e2bf42fceChristian Maeder server_rec *s,
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder const char *name,
f5e43c6208179131e179f075248880a8cae1e111cmaeder apr_pool_t *pool))
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
c8117ae0b6088d835211e494aef229558c814bd3cmaeder/**
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * Watchdog terminate hook.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * It is called when the watchog thread is terminated.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @param name Watchdog name.
3f5a42972cccb9c4fd0821def1292ec40b7a4871cmaeder * @param pool The pool used to create the watchdog.
c8117ae0b6088d835211e494aef229558c814bd3cmaeder */
cd6e5706893519bfcf24539afa252fcbed5097ddKlaus LuettichAPR_DECLARE_EXTERNAL_HOOK(ap, AP_WD, int, watchdog_exit, (
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder server_rec *s,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder const char *name,
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder apr_pool_t *pool))
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder/**
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * Fixed interval watchdog hook.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * It is called regulary on @AP_WD_TM_INTERVAL interval.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @param name Watchdog name.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * @param pool Temporary pool destroyed after the call.
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder */
e7d2b3903c7b44db432538b0d720c21062c24823Christian MaederAPR_DECLARE_EXTERNAL_HOOK(ap, AP_WD, int, watchdog_step, (
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder server_rec *s,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder const char *name,
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder apr_pool_t *pool))
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#ifdef __cplusplus
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder}
e8eb2b9d68adc3024eb1aa9899b902ed5a3fb460Christian Maeder#endif
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder#endif /* MOD_WATCHDOG_H */
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder/** @} */
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder