Files
cpython-source-deps/mod_db4/mod_db4.c
2017-09-04 13:40:25 -05:00

131 lines
3.1 KiB
C

/*-
* Copyright (c) 2004,2008 Oracle. All rights reserved.
*
* http://www.apache.org/licenses/LICENSE-2.0.txt
*
* authors: George Schlossnagle <george@omniti.com>
*/
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;
/*
* Declare ourselves so the configuration routines can find and know us.
* We'll fill it in at the end of the module.
*/
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();
/* reinstall default apache handler */
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);
}
/*
* Worker process init
*/
static void db4_child_init(server_rec *s, pool *p)
{
/* install our private signal handlers */
signal(SIGSEGV, sig_unrecoverable);
signal(SIGBUS, sig_unrecoverable);
signal(SIGABRT, sig_unrecoverable);
signal(SIGILL, sig_unrecoverable);
env_rsrc_list_init();
}
/*
* Worker process exit
*/
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, /* module initializer */
NULL, /* per-directory config creator */
NULL, /* dir config merger */
NULL, /* server config creator */
NULL, /* server config merger */
db4_cmds, /* command table */
NULL, /* [9] list of handlers */
NULL, /* [2] filename-to-URI translation */
NULL, /* [5] check/validate user_id */
NULL, /* [6] check user_id is valid *here* */
NULL, /* [4] check access by host address */
NULL, /* [7] MIME type checker/setter */
NULL, /* [8] fixups */
NULL, /* [10] logger */
#if MODULE_MAGIC_NUMBER >= 19970103
NULL, /* [3] header parser */
#endif
#if MODULE_MAGIC_NUMBER >= 19970719
db4_child_init, /* process initializer */
#endif
#if MODULE_MAGIC_NUMBER >= 19970728
db4_child_exit, /* process exit/cleanup */
#endif
#if MODULE_MAGIC_NUMBER >= 19970902
NULL /* [1] post read_request handling */
#endif
};
/* vim: set ts=4 sts=4 bs=2 ai expandtab : */