extern "C"
{
#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
#include "http_log.h"
#include "http_main.h"
#include "http_protocol.h"
#include "scoreboard.h"
#include "util_script.h"
#include "sem_utils.h"
}
#include "mod_db4_export.h"
#include "utils.h"
extern scoreboard *ap_scoreboard_image;
extern module MODULE_VAR_EXPORT db4_module;
void kill_all_children()
{
int i, ret = 1;
ap_sync_scoreboard_image();
for(;ret != 0;) {
ret = 0;
for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
ret += kill(ap_scoreboard_image->parent[i].pid, SIGTERM);
}
}
}
int moderator_main(void * ptr, child_info *ci)
{
for(;;) {
env_wait_for_child_crash();
kill_all_children();
env_global_rw_lock();
global_ref_count_clean();
env_ok_to_proceed();
env_global_unlock();
}
}
static void sig_unrecoverable(int sig)
{
env_child_crash();
signal(sig, SIG_DFL);
kill(getpid(), sig);
}
static void db4_init(server_rec *s, pool *p)
{
int mpid;
env_locks_init();
mpid=ap_spawn_child(p, moderator_main, NULL, kill_always, NULL, NULL, NULL);
}
static void db4_child_init(server_rec *s, pool *p)
{
signal(SIGSEGV, sig_unrecoverable);
signal(SIGBUS, sig_unrecoverable);
signal(SIGABRT, sig_unrecoverable);
signal(SIGILL, sig_unrecoverable);
env_rsrc_list_init();
}
static void db4_child_exit(server_rec *s, pool *p)
{
mod_db4_child_clean_process_shutdown();
}
static const command_rec db4_cmds[] =
{
{NULL}
};
module MODULE_VAR_EXPORT db4_module =
{
STANDARD_MODULE_STUFF,
db4_init,
NULL,
NULL,
NULL,
NULL,
db4_cmds,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
#if MODULE_MAGIC_NUMBER >= 19970103
NULL,
#endif
#if MODULE_MAGIC_NUMBER >= 19970719
db4_child_init,
#endif
#if MODULE_MAGIC_NUMBER >= 19970728
db4_child_exit,
#endif
#if MODULE_MAGIC_NUMBER >= 19970902
NULL
#endif
};