From 86fa0cb0d28fde7108cec1bc5f896aba3faa4c07 Mon Sep 17 00:00:00 2001 From: Ryan Bloom Date: Fri, 2 Mar 2001 22:46:33 +0000 Subject: [PATCH] Allow modules to query the MPM about it's execution profile. This query API can and should be extended in the future, but for now, max_daemons, and threading or forking is a very good start. Non-Unix MPM's do have the MPM query function, although there is no garauntee that the information is perfect, please check. Submitted by: Jon Travis git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@88437 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 5 +++++ include/ap_mpm.h | 20 +++++++++++++------- modules/generators/mod_info.c | 10 ++++++++++ server/mpm/beos/beos.c | 21 ++++++++++++++++----- server/mpm/experimental/perchild/perchild.c | 15 +++++++++++++-- server/mpm/perchild/perchild.c | 15 +++++++++++++-- server/mpm/prefork/prefork.c | 15 +++++++++++++-- server/mpm/spmt_os2/spmt_os2.c | 20 +++++++++++++++----- server/mpm/threaded/threaded.c | 15 +++++++++++++-- server/mpm/winnt/mpm_winnt.c | 20 ++++++++++++++++---- server/mpm_common.c | 3 ++- server/scoreboard.c | 4 +++- 12 files changed, 132 insertions(+), 31 deletions(-) diff --git a/CHANGES b/CHANGES index 9f92e20b50..11035efb51 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,10 @@ Changes with Apache 2.0.14-dev + *) Allow modules to query the MPM about it's execution profile. This + query API can and should be extended in the future, but for now, + max_daemons, and threading or forking is a very good start. + [Jon Travis ] + *) Modify mod_include to send blocks of data no larger than 9k. Without this, mod_include will wait until the whole file is parsed, or the first tag is found to send any data to the client. diff --git a/include/ap_mpm.h b/include/ap_mpm.h index ab527ed400..26a4d44aa5 100644 --- a/include/ap_mpm.h +++ b/include/ap_mpm.h @@ -125,13 +125,6 @@ AP_DECLARE(int) ap_mpm_run(apr_pool_t *pconf, apr_pool_t *plog, server_rec *serv */ AP_DECLARE(int) ap_graceful_stop_signalled(void); -/** - * Get the maximum number of daemons processes for this version of Apache - * @return The maximum number of daemon processes - * @deffunc int ap_get_max_daemons(void) - */ -AP_DECLARE(int) ap_get_max_daemons(void); - /** * Spawn a process with privileges that another module has requested * @param r The request_rec of the current request @@ -155,4 +148,17 @@ AP_DECLARE(apr_status_t) ap_os_create_privileged_process( apr_pool_t *p); +#define AP_MPMQ_MAX_DAEMONS 1 /* Max # of daemons */ +#define AP_MPMQ_IS_THREADED 2 /* MPM can do threading */ +#define AP_MPMQ_IS_FORKED 3 /* MPM can do forking */ + +/** + * Query a property of the current MPM. + * @param query_code One of APM_MPMQ_* + * @param result A location to place the result of the query + * @return APR_SUCCESS or APR_ENOTIMPL + * @deffunc int ap_mpm_query(int query_code, int *result) + */ +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result); + #endif diff --git a/modules/generators/mod_info.c b/modules/generators/mod_info.c index eff8abfe93..9624270c31 100644 --- a/modules/generators/mod_info.c +++ b/modules/generators/mod_info.c @@ -97,6 +97,7 @@ #include "apr_lib.h" #define APR_WANT_STRFUNC #include "apr_want.h" +#include "ap_mpm.h" typedef struct { const char *name; /* matching module name */ @@ -305,6 +306,8 @@ static int display_info(request_rec *r) } if (!r->args || !strcasecmp(r->args, "server")) { + int max_daemons, forked, threaded; + ap_rprintf(r, "Server Version: " "%s
\n", ap_get_server_version()); @@ -321,6 +324,13 @@ static int display_info(request_rec *r) "connection: %d    " "keep-alive: %d
", serv->timeout, serv->keep_alive_timeout); + ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons); + ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded); + ap_mpm_query(AP_MPMQ_IS_FORKED, &forked); + ap_rprintf(r, "MPM Information: " + "Max Daemons: %d Threaded: %s Forked: %s
\n", + max_daemons, threaded ? "yes" : "no", + forked ? "yes" : "no"); ap_rprintf(r, "Server Root: " "%s
\n", ap_server_root); ap_rprintf(r, "Config File: " diff --git a/server/mpm/beos/beos.c b/server/mpm/beos/beos.c index cda91239c0..3d3c7ac6c7 100644 --- a/server/mpm/beos/beos.c +++ b/server/mpm/beos/beos.c @@ -140,11 +140,6 @@ static int one_process = 0; int raise_sigstop_flags; #endif -AP_DECLARE(int) ap_get_max_daemons(void) -{ - return ap_max_child_assigned; -} - /* a clean exit from a child with proper cleanup static void clean_child_exit(int code) __attribute__ ((noreturn)); */ static void clean_child_exit(int code) @@ -633,6 +628,22 @@ static void server_main_loop(int remaining_threads_to_start) } } +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMONS: + *result = ap_max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = 1; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = 1; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) { int remaining_threads_to_start, i,j; diff --git a/server/mpm/experimental/perchild/perchild.c b/server/mpm/experimental/perchild/perchild.c index 7e3d6c31be..05ff39a28c 100644 --- a/server/mpm/experimental/perchild/perchild.c +++ b/server/mpm/experimental/perchild/perchild.c @@ -215,9 +215,20 @@ static apr_lock_t *process_accept_mutex; static const char *lock_fname; static apr_lock_t *thread_accept_mutex; -AP_DECLARE(int) ap_get_max_daemons(void) +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) { - return ap_max_daemons_limit; + switch(query_code){ + case AP_MPMQ_MAX_DAEMONS: + *result = ap_max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = 1; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = 1; + return APR_SUCCESS; + } + return APR_ENOTIMPL; } /* a clean exit from a child with proper cleanup */ diff --git a/server/mpm/perchild/perchild.c b/server/mpm/perchild/perchild.c index 7e3d6c31be..05ff39a28c 100644 --- a/server/mpm/perchild/perchild.c +++ b/server/mpm/perchild/perchild.c @@ -215,9 +215,20 @@ static apr_lock_t *process_accept_mutex; static const char *lock_fname; static apr_lock_t *thread_accept_mutex; -AP_DECLARE(int) ap_get_max_daemons(void) +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) { - return ap_max_daemons_limit; + switch(query_code){ + case AP_MPMQ_MAX_DAEMONS: + *result = ap_max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = 1; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = 1; + return APR_SUCCESS; + } + return APR_ENOTIMPL; } /* a clean exit from a child with proper cleanup */ diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c index 6693f37104..4e40eaa16e 100644 --- a/server/mpm/prefork/prefork.c +++ b/server/mpm/prefork/prefork.c @@ -302,9 +302,20 @@ static void accept_mutex_off(void) #define SAFE_ACCEPT(stmt) do {stmt;} while(0) #endif -AP_DECLARE(int) ap_get_max_daemons(void) +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) { - return ap_max_daemons_limit; + switch(query_code){ + case AP_MPMQ_MAX_DAEMONS: + *result = ap_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = 1; + return APR_SUCCESS; + } + return APR_ENOTIMPL; } #if defined(NEED_WAITPID) diff --git a/server/mpm/spmt_os2/spmt_os2.c b/server/mpm/spmt_os2/spmt_os2.c index 8cb31273d0..ebae795d4d 100644 --- a/server/mpm/spmt_os2/spmt_os2.c +++ b/server/mpm/spmt_os2/spmt_os2.c @@ -217,11 +217,6 @@ static void accept_mutex_off(void) #define SAFE_ACCEPT(stmt) do {stmt;} while(0) #endif -AP_DECLARE(int) ap_get_max_daemons(void) -{ - return max_daemons_limit; -} - static int find_thread_by_tid(int tid) { int i; @@ -883,6 +878,21 @@ static void perform_idle_server_maintenance(void) } } +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMONS: + *result = max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = 1; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = 0; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} /***************************************************************** * Executive routines. diff --git a/server/mpm/threaded/threaded.c b/server/mpm/threaded/threaded.c index fe591b7707..db5bda9e39 100644 --- a/server/mpm/threaded/threaded.c +++ b/server/mpm/threaded/threaded.c @@ -171,9 +171,20 @@ static const char *lock_fname; #define SAFE_ACCEPT(stmt) (stmt) #endif -AP_DECLARE(int) ap_get_max_daemons(void) +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) { - return ap_max_daemons_limit; + switch(query_code){ + case AP_MPMQ_MAX_DAEMONS: + *result = ap_max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = 1; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = 1; + return APR_SUCCESS; + } + return APR_ENOTIMPL; } /* a clean exit from a child with proper cleanup */ diff --git a/server/mpm/winnt/mpm_winnt.c b/server/mpm/winnt/mpm_winnt.c index 61797356d3..704ef5663d 100644 --- a/server/mpm/winnt/mpm_winnt.c +++ b/server/mpm/winnt/mpm_winnt.c @@ -126,10 +126,6 @@ DWORD parent_pid; * code */ ap_generation_t volatile ap_my_generation=0; /* Used by the scoreboard */ -AP_DECLARE(int) ap_get_max_daemons(void) -{ - return 1; -} /* This is the helper code to resolve late bound entry points * missing from one or more releases of the Win32 API... @@ -1780,6 +1776,22 @@ apr_array_header_t *mpm_new_argv; * service after we preflight the config. */ +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMONS: + *result = MAXIMUM_WAIT_OBJECTS; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = 1; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = 0; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + static apr_status_t service_to_start_success; static int inst_argc; static const char * const *inst_argv; diff --git a/server/mpm_common.c b/server/mpm_common.c index 6ac6868a9e..cadc7f076c 100644 --- a/server/mpm_common.c +++ b/server/mpm_common.c @@ -94,8 +94,9 @@ void ap_reclaim_child_processes(int terminate) apr_status_t waitret; int tries; int not_dead_yet; - int max_daemons = ap_get_max_daemons(); + int max_daemons; + ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons); MPM_SYNC_CHILD_TABLE(); for (tries = terminate ? 4 : 1; tries <= 9; ++tries) { diff --git a/server/scoreboard.c b/server/scoreboard.c index 88ebe0fb9e..80277debaf 100644 --- a/server/scoreboard.c +++ b/server/scoreboard.c @@ -253,7 +253,9 @@ AP_DECLARE(void) ap_increment_counts(int child_num, int thread_num, request_rec AP_DECLARE(int) find_child_by_pid(apr_proc_t *pid) { int i; - int max_daemons_limit = ap_get_max_daemons(); + int max_daemons_limit; + + ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons_limit); for (i = 0; i < max_daemons_limit; ++i) if (ap_scoreboard_image->parent[i].pid == pid->pid) -- 2.49.0