From: Joe Orton Date: Tue, 16 May 2006 14:17:02 +0000 (+0000) Subject: * server/main.c (abort_on_oom): New function. X-Git-Tag: 2.3.0~2391 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8984444d42b36976f81ac8fdc522574ba5da83ce;p=thirdparty%2Fapache%2Fhttpd.git * server/main.c (abort_on_oom): New function. (create_process): Set abort callback for process pool. (main): Set abort callback for global pool. Reviewed by: colm git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@406953 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/server/main.c b/server/main.c index 5ab32479480..3761a12d2a5 100644 --- a/server/main.c +++ b/server/main.c @@ -40,6 +40,10 @@ #include "ap_mpm.h" #include "mpm_common.h" +#if APR_HAVE_UNISTD_H +#include +#endif + /* WARNING: Win32 binds http_main.c dynamically to the server. Please place * extern functions and global data in another appropriate module. * @@ -261,6 +265,17 @@ static void destroy_and_exit_process(process_rec *process, exit(process_exit_value); } +#define OOM_MESSAGE "[crit] Memory allocation failed, " \ + "aborting process." APR_EOL_STR + +/* APR callback invoked if allocation fails. */ +static int abort_on_oom(int retcode) +{ + write(STDERR_FILENO, OOM_MESSAGE, strlen(OOM_MESSAGE)); + abort(); + return retcode; /* unreachable, hopefully. */ +} + static process_rec *create_process(int argc, const char * const *argv) { process_rec *process; @@ -279,6 +294,7 @@ static process_rec *create_process(int argc, const char * const *argv) exit(1); } + apr_pool_abort_set(abort_on_oom, cntx); apr_pool_tag(cntx, "process"); ap_open_stderr_log(cntx); @@ -449,6 +465,10 @@ int main(int argc, const char * const argv[]) pconf = process->pconf; ap_server_argv0 = process->short_name; + /* Set up the OOM callback in the global pool, so all pools should + * by default inherit it. */ + apr_pool_abort_set(abort_on_oom, apr_pool_parent_get(process->pool)); + #if APR_CHARSET_EBCDIC if (ap_init_ebcdic(pglobal) != APR_SUCCESS) { destroy_and_exit_process(process, 1);