diff options
author | Ryan Bloom <rbb@apache.org> | 2000-05-04 04:02:37 +0000 |
---|---|---|
committer | Ryan Bloom <rbb@apache.org> | 2000-05-04 04:02:37 +0000 |
commit | 8c385f0dbd65975ceb64ea1c9670592ccd90e62e (patch) | |
tree | 0d0d25c4a4817c39d489ec423d170718061f3788 | |
parent | 66c90f61efdbec45af04634cee49e9c4fefa09c2 (diff) | |
download | httpd-8c385f0dbd65975ceb64ea1c9670592ccd90e62e.tar.gz |
Make reliable piped logs work on 2.0.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@85136 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | STATUS | 7 | ||||
-rw-r--r-- | include/ap_mpm.h | 40 | ||||
-rw-r--r-- | modules/generators/mod_cgid.c | 4 | ||||
-rw-r--r-- | server/log.c | 33 | ||||
-rw-r--r-- | server/main.c | 4 | ||||
-rw-r--r-- | server/mpm/dexter/dexter.c | 4 | ||||
-rw-r--r-- | server/mpm/mpmt_beos/mpmt_beos.c | 155 | ||||
-rw-r--r-- | server/mpm/mpmt_pthread/mpmt_pthread.c | 4 | ||||
-rw-r--r-- | server/mpm/prefork/prefork.c | 38 | ||||
-rw-r--r-- | server/mpm/spmt_os2/spmt_os2.c | 126 | ||||
-rw-r--r-- | support/rotatelogs.c | 3 |
11 files changed, 56 insertions, 362 deletions
@@ -1,5 +1,5 @@ Apache 2.0 STATUS: -Last modified at [$Date: 2000/05/01 21:52:18 $] +Last modified at [$Date: 2000/05/04 04:02:10 $] Release: @@ -31,11 +31,6 @@ RELEASE SHOWSTOPPERS: http_connection.c and into the MPMs. Status: - * Reliable piped logs look broken everywhere. Each MPM includes essentially - identical code to ap_register_other_child(), etc. Most of this code can - be moved out of the MPMs and into some common file (http_core.c?). - Dean says presumably you mean an os-specific file? - * Put back resource limit code * suEXEC doesn't work diff --git a/include/ap_mpm.h b/include/ap_mpm.h index 73ee7e3014..d4a4d341de 100644 --- a/include/ap_mpm.h +++ b/include/ap_mpm.h @@ -130,44 +130,4 @@ void ap_start_restart(int graceful); */ void ap_signal_parent(ap_pool_t *p, const char* signal, const char* server_root); -#ifdef HAS_OTHER_CHILD -/* - * register an other_child -- a child which the main loop keeps track of - * and knows it is different than the rest of the scoreboard. - * - * pid is the pid of the child. - * - * maintenance is a function that is invoked with a reason, the data - * pointer passed here, and when appropriate a status result from waitpid(). - * - * write_fd is an fd that is probed for writing by select() if it is ever - * unwritable, then maintenance is invoked with reason OC_REASON_UNWRITABLE. - * This is useful for log pipe children, to know when they've blocked. To - * disable this feature, use -1 for write_fd. - */ -API_EXPORT(void) ap_register_other_child(int pid, - void (*maintenance) (int reason, void *data, ap_wait_t status), void *data, - int write_fd); -#define OC_REASON_DEATH 0 /* child has died, caller must call - * unregister still */ -#define OC_REASON_UNWRITABLE 1 /* write_fd is unwritable */ -#define OC_REASON_RESTART 2 /* a restart is occuring, perform - * any necessary cleanup (including - * sending a special signal to child) - */ -#define OC_REASON_UNREGISTER 3 /* unregister has been called, do - * whatever is necessary (including - * kill the child) */ -#define OC_REASON_LOST 4 /* somehow the child exited without - * us knowing ... buggy os? */ - -/* - * unregister an other_child. Note that the data pointer is used here, and - * is assumed to be unique per other_child. This is because the pid and - * write_fd are possibly killed off separately. - */ -API_EXPORT(void) ap_unregister_other_child(void *data); - -#endif - #endif diff --git a/modules/generators/mod_cgid.c b/modules/generators/mod_cgid.c index 22275159c1..1db51715bf 100644 --- a/modules/generators/mod_cgid.c +++ b/modules/generators/mod_cgid.c @@ -299,7 +299,7 @@ static int call_exec(request_rec *r, char *argv0, char **env, int shellcmd) static void cgid_maint(int reason, void *data, ap_wait_t status) { -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD int *sd = data; switch (reason) { case OC_REASON_DEATH: @@ -584,7 +584,7 @@ static void cgid_init(ap_pool_t *p, ap_pool_t *plog, ap_pool_t *ptemp, server_re cgid_server(main_server); exit(-1); } -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD ap_register_other_child(pid, cgid_maint, &pid, -1); #endif } diff --git a/server/log.c b/server/log.c index e7f0b47ea7..2d3e87f7ca 100644 --- a/server/log.c +++ b/server/log.c @@ -594,15 +594,12 @@ static int piped_log_spawn(piped_log *pl) ap_os_proc_t pid; ap_proc_t *procnew; - /* pjr - calls to block and unblock alarms weren't here before, was this */ - /* an oversight or intentional? */ - #ifdef SIGHUP ap_signal(SIGHUP, SIG_IGN); #endif if ((ap_createprocattr_init(&procattr, pl->p) != APR_SUCCESS) || - (ap_setprocattr_dir(procattr, pl->program) != APR_SUCCESS) || - (ap_set_childin(procattr, ap_piped_log_read_fd(pl), ap_piped_log_write_fd(pl)) != APR_SUCCESS)) { + (ap_setprocattr_childin(procattr, ap_piped_log_read_fd(pl), + ap_piped_log_write_fd(pl)) != APR_SUCCESS)) { /* Something bad happened, give up and go away. */ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "piped_log_spawn: unable to exec '%s': %s", @@ -610,7 +607,13 @@ static int piped_log_spawn(piped_log *pl) rc = -1; } else { - rc = ap_create_process(&procnew, pl->program, NULL, NULL, procattr, pl->p); + char **args; + const char *pname; + + ap_tokenize_to_argv(pl->program, &args, pl->p); + pname = ap_pstrdup(pl->p, args[0]); + + rc = ap_create_process(&procnew, pname, args, NULL, procattr, pl->p); if (rc == APR_SUCCESS) { /* pjr - This no longer happens inside the child, */ @@ -618,13 +621,11 @@ static int piped_log_spawn(piped_log *pl) /* successful that the child is running. */ RAISE_SIGSTOP(PIPED_LOG_SPAWN); pl->pid = procnew; - ap_get_os_proc(&pid, procnew); - ap_register_other_child(pid, piped_log_maintenance, pl, ap_piped_log_write_fd(pl)); + ap_register_other_child(procnew, piped_log_maintenance, pl, + ap_piped_log_write_fd(pl), pl->p); } } -/* ap_unblock_alarms(); */ - return 0; } @@ -634,8 +635,8 @@ static void piped_log_maintenance(int reason, void *data, ap_wait_t status) piped_log *pl = data; switch (reason) { - case OC_REASON_DEATH: - case OC_REASON_LOST: + case APR_OC_REASON_DEATH: + case APR_OC_REASON_LOST: pl->pid = NULL; ap_unregister_other_child(pl); if (pl->program == NULL) { @@ -651,20 +652,20 @@ static void piped_log_maintenance(int reason, void *data, ap_wait_t status) } break; - case OC_REASON_UNWRITABLE: + case APR_OC_REASON_UNWRITABLE: if (pl->pid != NULL) { ap_kill(pl->pid, SIGTERM); } break; - case OC_REASON_RESTART: + case APR_OC_REASON_RESTART: pl->program = NULL; if (pl->pid != NULL) { ap_kill(pl->pid, SIGTERM); } break; - case OC_REASON_UNREGISTER: + case APR_OC_REASON_UNREGISTER: break; } } @@ -706,6 +707,8 @@ API_EXPORT(piped_log *) ap_open_piped_log(ap_pool_t *p, const char *program) errno = save_errno; return NULL; } + ap_block_pipe(ap_piped_log_read_fd(pl)); + ap_block_pipe(ap_piped_log_write_fd(pl)); ap_register_cleanup(p, pl, piped_log_cleanup, piped_log_cleanup_for_exec); if (piped_log_spawn(pl) == -1) { int save_errno = errno; diff --git a/server/main.c b/server/main.c index 68709998fd..0e5f0b5c50 100644 --- a/server/main.c +++ b/server/main.c @@ -136,8 +136,8 @@ static void show_compile_settings(void) #ifdef SINGLE_LISTEN_UNSERIALIZED_ACCEPT printf(" -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT\n"); #endif -#ifdef HAS_OTHER_CHILD - printf(" -D HAS_OTHER_CHILD\n"); +#ifdef APR_HAS_OTHER_CHILD + printf(" -D APR_HAS_OTHER_CHILD\n"); #endif #ifdef HAVE_RELIABLE_PIPED_LOGS printf(" -D HAVE_RELIABLE_PIPED_LOGS\n"); diff --git a/server/mpm/dexter/dexter.c b/server/mpm/dexter/dexter.c index b2f8d5cf74..0f04013bc0 100644 --- a/server/mpm/dexter/dexter.c +++ b/server/mpm/dexter/dexter.c @@ -283,7 +283,7 @@ static int wait_or_timeout(ap_wait_t *status) ++wait_or_timeout_counter; if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) { wait_or_timeout_counter = 0; -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD probe_writable_fds(); #endif } @@ -1110,7 +1110,7 @@ static void server_main_loop(int remaining_children_to_start) make_child(server_conf, child_slot, time(NULL)); --remaining_children_to_start; } -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD } else if (reap_other_child(pid, status) == 0) { /* handled */ diff --git a/server/mpm/mpmt_beos/mpmt_beos.c b/server/mpm/mpmt_beos/mpmt_beos.c index f2f06ed542..5556a37fab 100644 --- a/server/mpm/mpmt_beos/mpmt_beos.c +++ b/server/mpm/mpmt_beos/mpmt_beos.c @@ -145,20 +145,6 @@ static int one_process = 0; int raise_sigstop_flags; #endif -#ifdef HAS_OTHER_CHILD -/* used to maintain list of children which aren't part of the scoreboard */ -typedef struct other_child_rec other_child_rec; -struct other_child_rec { - other_child_rec *next; - int pid; - void (*maintenance) (int, void *, ap_wait_t); - void *data; - int write_fd; -}; -static other_child_rec *other_children; -#endif - - /* Global, alas, so http_core can talk to us */ enum server_token_type ap_server_tokens = SrvTk_FULL; @@ -182,117 +168,6 @@ void clean_child_exit(int code) exit(code); } -/***************************************************************** - * dealing with other children - */ - -#ifdef HAS_OTHER_CHILD -API_EXPORT(void) ap_register_other_child(int pid, - void (*maintenance) (int reason, void *, ap_wait_t status), - void *data, int write_fd) -{ - other_child_rec *ocr; - - ocr = ap_palloc(pconf, sizeof(*ocr)); - ocr->pid = pid; - ocr->maintenance = maintenance; - ocr->data = data; - ocr->write_fd = write_fd; - ocr->next = other_children; - other_children = ocr; -} - -/* note that since this can be called by a maintenance function while we're - * scanning the other_children list, all scanners should protect themself - * by loading ocr->next before calling any maintenance function. - */ -API_EXPORT(void) ap_unregister_other_child(void *data) -{ - other_child_rec **pocr, *nocr; - - for (pocr = &other_children; *pocr; pocr = &(*pocr)->next) { - if ((*pocr)->data == data) { - nocr = (*pocr)->next; - (*(*pocr)->maintenance) (OC_REASON_UNREGISTER, (*pocr)->data, -1); - *pocr = nocr; - /* XXX: um, well we've just wasted some space in pconf ? */ - return; - } - } -} - -/* test to ensure that the write_fds are all still writable, otherwise - * invoke the maintenance functions as appropriate */ -static void probe_writable_fds(void) -{ - return; -#if 0 - fd_set writable_fds; - int fd_max; - other_child_rec *ocr, *nocr; - struct timeval tv; - int rc; - - if (other_children == NULL) - return; - - fd_max = 0; - FD_ZERO(&writable_fds); - do { - for (ocr = other_children; ocr; ocr = ocr->next) { - if (ocr->write_fd == -1) - continue; - FD_SET(ocr->write_fd, &writable_fds); - if (ocr->write_fd > fd_max) { - fd_max = ocr->write_fd; - } - } - if (fd_max == 0) - return; - - tv.tv_sec = 0; - tv.tv_usec = 0; - rc = ap_select(fd_max + 1, NULL, &writable_fds, NULL, &tv); - } while (rc == -1 && errno == EINTR); - - if (rc == -1) { - /* XXX: uhh this could be really bad, we could have a bad file - * descriptor due to a bug in one of the maintenance routines */ - ap_log_unixerr("probe_writable_fds", "select", - "could not probe writable fds", server_conf); - return; - } - if (rc == 0) - return; - - for (ocr = other_children; ocr; ocr = nocr) { - nocr = ocr->next; - if (ocr->write_fd == -1) - continue; - if (FD_ISSET(ocr->write_fd, &writable_fds)) - continue; - (*ocr->maintenance) (OC_REASON_UNWRITABLE, ocr->data, -1); - } -#endif -} - -/* possibly reap an other_child, return 0 if yes, -1 if not */ -static int reap_other_child(int pid, ap_wait_t status) -{ - other_child_rec *ocr, *nocr; - - for (ocr = other_children; ocr; ocr = nocr) { - nocr = ocr->next; - if (ocr->pid != pid) - continue; - ocr->pid = -1; - (*ocr->maintenance) (OC_REASON_DEATH, ocr->data, status); - return 0; - } - return -1; -} -#endif - static void reclaim_child_processes(int terminate) { int i, status; @@ -300,9 +175,6 @@ static void reclaim_child_processes(int terminate) struct timeval tv; int waitret, tries; int not_dead_yet; -#ifdef HAS_OTHER_CHILD - other_child_rec *ocr, *nocr; -#endif for (tries = terminate ? 4 : 1; tries <= 9; ++tries) { /* don't want to hold up progress any more than @@ -364,28 +236,7 @@ static void reclaim_child_processes(int terminate) break; } } -#ifdef HAS_OTHER_CHILD - for (ocr = other_children; ocr; ocr = nocr) { - nocr = ocr->next; - if (ocr->pid == -1) - continue; - - waitret = waitpid(ocr->pid, &status, WNOHANG); - if (waitret == ocr->pid) { - ocr->pid = -1; - (*ocr->maintenance) (OC_REASON_DEATH, ocr->data, status); - } - else if (waitret == 0) { - (*ocr->maintenance) (OC_REASON_RESTART, ocr->data, -1); - ++not_dead_yet; - } - else if (waitret == -1) { - /* uh what the heck? they didn't call unregister? */ - ocr->pid = -1; - (*ocr->maintenance) (OC_REASON_LOST, ocr->data, -1); - } - } -#endif + ap_check_other_child(); if (!not_dead_yet) { /* nothing left to wait for */ break; @@ -411,7 +262,7 @@ static int wait_or_timeout(ap_wait_t *status) ++wait_or_timeout_counter; if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) { wait_or_timeout_counter = 0; -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD probe_writable_fds(); #endif } @@ -999,7 +850,7 @@ static void server_main_loop(int remaining_children_to_start) make_child(server_conf, child_slot, time(NULL)); --remaining_children_to_start; } -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD } else if (reap_other_child(pid, status) == 0) { /* handled */ diff --git a/server/mpm/mpmt_pthread/mpmt_pthread.c b/server/mpm/mpmt_pthread/mpmt_pthread.c index 7f300c7db2..59604438ea 100644 --- a/server/mpm/mpmt_pthread/mpmt_pthread.c +++ b/server/mpm/mpmt_pthread/mpmt_pthread.c @@ -279,7 +279,7 @@ static int wait_or_timeout(ap_wait_t *status) ++wait_or_timeout_counter; if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) { wait_or_timeout_counter = 0; -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD probe_writable_fds(); #endif } @@ -1133,7 +1133,7 @@ static void server_main_loop(int remaining_children_to_start) make_child(server_conf, child_slot, time(NULL)); --remaining_children_to_start; } -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD } else if (reap_other_child(pid, status) == 0) { /* handled */ diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c index 3c68849cca..052a76a503 100644 --- a/server/mpm/prefork/prefork.c +++ b/server/mpm/prefork/prefork.c @@ -1014,12 +1014,14 @@ static void increment_counts(int child_num, request_rec *r) } */ -static int find_child_by_pid(int pid) +static int find_child_by_pid(ap_proc_t *pid) { int i; + int actual_pid; + ap_get_os_proc(&actual_pid, pid); for (i = 0; i < max_daemons_limit; ++i) - if (ap_scoreboard_image->parent[i].pid == pid) + if (ap_scoreboard_image->parent[i].pid == actual_pid) return i; return -1; @@ -1147,23 +1149,24 @@ int reap_children(ap_wait_t *status) #endif static int wait_or_timeout_counter; -static int wait_or_timeout(ap_wait_t *status) +static ap_proc_t *wait_or_timeout(ap_wait_t *status, ap_pool_t *p) { struct timeval tv; - int ret; + ap_status_t rv; + ap_proc_t *ret = NULL; ++wait_or_timeout_counter; if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) { wait_or_timeout_counter = 0; -#ifdef HAS_OTHER_CHILD - probe_writable_fds(); +#ifdef APR_HAS_OTHER_CHILD + ap_probe_writable_fds(); #endif } - ret = waitpid(-1, status, WNOHANG); - if (ret == -1 && errno == EINTR) { - return -1; + rv = ap_wait_all_procs(&ret, WNOHANG, p); + if (rv != -1 && rv == APR_CHILD_NOTDONE) { + return NULL; } - if (ret > 0) { + if (rv == APR_CHILD_DONE) { return ret; } #ifdef NEED_WAITPID @@ -1174,7 +1177,7 @@ static int wait_or_timeout(ap_wait_t *status) tv.tv_sec = SCOREBOARD_MAINTENANCE_INTERVAL / 1000000; tv.tv_usec = SCOREBOARD_MAINTENANCE_INTERVAL % 1000000; ap_select(0, NULL, NULL, NULL, &tv); - return -1; + return NULL; } /* handle all varieties of core dumping signals */ @@ -1937,8 +1940,10 @@ static void perform_idle_server_maintenance(void) } -static void process_child_status(int pid, ap_wait_t status) +static void process_child_status(ap_proc_t *abs_pid, ap_wait_t status) { + int pid; + ap_get_os_proc(&pid, abs_pid); /* Child died... if it died due to a fatal error, * we should simply bail out. */ @@ -2096,13 +2101,14 @@ int ap_mpm_run(ap_pool_t *_pconf, ap_pool_t *plog, server_rec *s) while (!restart_pending && !shutdown_pending) { int child_slot; ap_wait_t status; - int pid = wait_or_timeout(&status); + /* this is a memory leak, but I'll fix it later. */ + ap_proc_t *pid = wait_or_timeout(&status, pconf); /* XXX: if it takes longer than 1 second for all our children * to start up and get into IDLE state then we may spawn an * extra child */ - if (pid >= 0) { + if (pid != NULL) { process_child_status(pid, status); /* non-fatal death... note that it's gone in the scoreboard. */ ap_sync_scoreboard_image(); @@ -2119,9 +2125,9 @@ int ap_mpm_run(ap_pool_t *_pconf, ap_pool_t *plog, server_rec *s) make_child(server_conf, child_slot, time(0)); --remaining_children_to_start; } -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD } - else if (reap_other_child(pid, status) == 0) { + else if (ap_reap_other_child(pid, status) == 0) { /* handled */ #endif } diff --git a/server/mpm/spmt_os2/spmt_os2.c b/server/mpm/spmt_os2/spmt_os2.c index 3bf158c46a..bf85505179 100644 --- a/server/mpm/spmt_os2/spmt_os2.c +++ b/server/mpm/spmt_os2/spmt_os2.c @@ -115,19 +115,6 @@ static server_rec *server_conf; static int one_process = 0; -#ifdef HAS_OTHER_CHILD -/* used to maintain list of children which aren't part of the scoreboard */ -typedef struct other_child_rec other_child_rec; -struct other_child_rec { - other_child_rec *next; - int pid; - void (*maintenance) (int, void *, ap_wait_t); - void *data; - int write_fd; -}; -static other_child_rec *other_children; -#endif - static ap_pool_t *pconf; /* Pool for config stuff */ static scoreboard *ap_scoreboard_image = NULL; @@ -243,115 +230,6 @@ static void accept_mutex_off(void) #define SAFE_ACCEPT(stmt) do {stmt;} while(0) #endif - -/***************************************************************** - * dealing with other children - */ - -#ifdef HAS_OTHER_CHILD -API_EXPORT(void) ap_register_other_child(int pid, - void (*maintenance) (int reason, void *, ap_wait_t status), - void *data, int write_fd) -{ - other_child_rec *ocr; - - ocr = ap_palloc(pconf, sizeof(*ocr)); - ocr->pid = pid; - ocr->maintenance = maintenance; - ocr->data = data; - ocr->write_fd = write_fd; - ocr->next = other_children; - other_children = ocr; -} - -/* note that since this can be called by a maintenance function while we're - * scanning the other_children list, all scanners should protect themself - * by loading ocr->next before calling any maintenance function. - */ -API_EXPORT(void) ap_unregister_other_child(void *data) -{ - other_child_rec **pocr, *nocr; - - for (pocr = &other_children; *pocr; pocr = &(*pocr)->next) { - if ((*pocr)->data == data) { - nocr = (*pocr)->next; - (*(*pocr)->maintenance) (OC_REASON_UNREGISTER, (*pocr)->data, -1); - *pocr = nocr; - /* XXX: um, well we've just wasted some space in pconf ? */ - return; - } - } -} - -/* test to ensure that the write_fds are all still writable, otherwise - * invoke the maintenance functions as appropriate */ -static void probe_writable_fds(void) -{ - fd_set writable_fds; - int fd_max; - other_child_rec *ocr, *nocr; - struct timeval tv; - int rc; - - if (other_children == NULL) - return; - - fd_max = 0; - FD_ZERO(&writable_fds); - do { - for (ocr = other_children; ocr; ocr = ocr->next) { - if (ocr->write_fd == -1) - continue; - FD_SET(ocr->write_fd, &writable_fds); - if (ocr->write_fd > fd_max) { - fd_max = ocr->write_fd; - } - } - if (fd_max == 0) - return; - - tv.tv_sec = 0; - tv.tv_usec = 0; - rc = ap_select(fd_max + 1, NULL, &writable_fds, NULL, &tv); - } while (rc == -1 && errno == EINTR); - - if (rc == -1) { - /* XXX: uhh this could be really bad, we could have a bad file - * descriptor due to a bug in one of the maintenance routines */ - ap_log_unixerr("probe_writable_fds", "select", - "could not probe writable fds", server_conf); - return; - } - if (rc == 0) - return; - - for (ocr = other_children; ocr; ocr = nocr) { - nocr = ocr->next; - if (ocr->write_fd == -1) - continue; - if (FD_ISSET(ocr->write_fd, &writable_fds)) - continue; - (*ocr->maintenance) (OC_REASON_UNWRITABLE, ocr->data, -1); - } -} - -/* possibly reap an other_child, return 0 if yes, -1 if not */ -static int reap_other_child(int pid, ap_wait_t status) -{ - other_child_rec *ocr, *nocr; - - for (ocr = other_children; ocr; ocr = nocr) { - nocr = ocr->next; - if (ocr->pid != pid) - continue; - ocr->pid = -1; - (*ocr->maintenance) (OC_REASON_DEATH, ocr->data, status); - return 0; - } - return -1; -} -#endif - API_EXPORT(int) ap_exists_scoreboard_image(void) { return (ap_scoreboard_image ? 1 : 0); @@ -503,7 +381,7 @@ static int wait_or_timeout(ap_wait_t *status) ++wait_or_timeout_counter; if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) { wait_or_timeout_counter = 0; -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD probe_writable_fds(); #endif } @@ -1483,7 +1361,7 @@ int ap_mpm_run(ap_pool_t *_pconf, ap_pool_t *plog, server_rec *s) make_child(server_conf, child_slot, time(0)); --remaining_children_to_start; } -#ifdef HAS_OTHER_CHILD +#ifdef APR_HAS_OTHER_CHILD /* TODO: this won't work, we waited on a thread not a process } else if (reap_other_child(pid, status) == 0) { diff --git a/support/rotatelogs.c b/support/rotatelogs.c index d8316c606e..e49f0c0b69 100644 --- a/support/rotatelogs.c +++ b/support/rotatelogs.c @@ -72,8 +72,9 @@ #include <errno.h> #include <fcntl.h> #include <stdio.h> +#include <stdlib.h> -int main (int argc, char **argv) +int main (int argc, char *argv[]) { char buf[BUFSIZE], buf2[MAX_PATH]; time_t tLogEnd = 0; |