From: Ryan Bloom Date: Fri, 13 Apr 2001 19:00:39 +0000 (+0000) Subject: Add more options to the ap_mpm_query function. This also allows MPMs to X-Git-Tag: 2.0.17~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd0738be95d681141d961f5aa5c6a5dcdb9ef847;p=thirdparty%2Fapache%2Fhttpd.git Add more options to the ap_mpm_query function. This also allows MPMs to report if their threads are dynamic or static. Finally, this also implements a new API, ap_show_mpm, which returns the MPM that was required into the core. We tried to make all of the MPMs report their threading capabilities correctly, but each MPM expert should double check us. Submitted by: Harrie Hazewinkel git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@88851 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/include/ap_mpm.h b/include/ap_mpm.h index 549faf71ccb..8072c823d8e 100644 --- a/include/ap_mpm.h +++ b/include/ap_mpm.h @@ -147,10 +147,23 @@ AP_DECLARE(apr_status_t) ap_os_create_privileged_process( apr_procattr_t *attr, apr_pool_t *p); +/* Subtypes/Values for AP_MPMQ_IS_THREADED and AP_MPMQ_IS_FORKED */ +#define AP_MPMQ_NOT_SUPPORTED 0 /* This value specifies whether */ + /* an MPM is capable of */ + /* threading or forking. */ +#define AP_MPMQ_STATIC 1 /* This value specifies whether */ + /* an MPM is using a static # */ + /* threads or daemons. */ +#define AP_MPMQ_DYNAMIC 2 /* This value specifies whether */ + /* an MPM is using a dynamic # */ + /* threads or daemons. */ -#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 */ +#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 */ +#define AP_MPMQ_HARD_LIMIT_DAEMONS 4 /* The compiled max # deamons */ +#define AP_MPMQ_HARD_LIMIT_THREADS 5 /* The compiled max # threads */ +#define AP_MPMQ_MAX_THREADS 6 /* Max # of threads */ /** * Query a property of the current MPM. diff --git a/modules/generators/mod_info.c b/modules/generators/mod_info.c index cfe57e2991e..3c5e014fcfb 100644 --- a/modules/generators/mod_info.c +++ b/modules/generators/mod_info.c @@ -327,6 +327,7 @@ static int display_info(request_rec *r) 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 used is %s
\n", ap_show_mpm()); ap_rprintf(r, "MPM Information: " "Max Daemons: %d Threaded: %s Forked: %s
\n", max_daemons, threaded ? "yes" : "no", diff --git a/server/config.c b/server/config.c index bf52650d85e..8391140f218 100644 --- a/server/config.c +++ b/server/config.c @@ -92,6 +92,7 @@ #include "http_main.h" #include "http_vhost.h" #include "util_cfgtree.h" +#include "mpm.h" AP_DECLARE_DATA const char *ap_server_argv0; @@ -1737,3 +1738,7 @@ AP_DECLARE(void) ap_show_modules(void) printf(" %s\n", ap_loaded_modules[n]->name); } +AP_DECLARE(const char *) ap_show_mpm(void) +{ + return MPM_NAME; +} diff --git a/server/mpm/beos/beos.c b/server/mpm/beos/beos.c index 2ad631cc59b..c0128df9b52 100644 --- a/server/mpm/beos/beos.c +++ b/server/mpm/beos/beos.c @@ -657,10 +657,19 @@ AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) *result = ap_max_child_assigned; return APR_SUCCESS; case AP_MPMQ_IS_THREADED: - *result = 1; + *result = AP_MPMQ_DYNAMIC; return APR_SUCCESS; case AP_MPMQ_IS_FORKED: - *result = 0; + *result = AP_MPMQ_NOT_SUPPORTED; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = ap_threads_per_child; return APR_SUCCESS; } return APR_ENOTIMPL; diff --git a/server/mpm/beos/mpm.h b/server/mpm/beos/mpm.h index e6de2765569..3a652f05027 100644 --- a/server/mpm/beos/mpm.h +++ b/server/mpm/beos/mpm.h @@ -62,6 +62,7 @@ #define BEOS_MPM #include "scoreboard.h" +#define MPM_NAME "Beos" #define AP_MPM_NEEDS_RECLAIM_CHILD_PROCESSES 1 #define MPM_SYNC_CHILD_TABLE() #define MPM_CHILD_PID(i) (ap_scoreboard_image->servers[0][i].tid) diff --git a/server/mpm/experimental/perchild/mpm.h b/server/mpm/experimental/perchild/mpm.h index d360ae67d6e..d24f8b4abaa 100644 --- a/server/mpm/experimental/perchild/mpm.h +++ b/server/mpm/experimental/perchild/mpm.h @@ -65,6 +65,8 @@ #define PERCHILD_MPM +#define MPM_NAME "Perchild" + #define AP_MPM_NEEDS_RECLAIM_CHILD_PROCESSES 1 #define MPM_SYNC_CHILD_TABLE() #define MPM_CHILD_PID(i) (ap_child_table[i].pid) diff --git a/server/mpm/experimental/perchild/perchild.c b/server/mpm/experimental/perchild/perchild.c index 425d7eccee9..4555bb11ceb 100644 --- a/server/mpm/experimental/perchild/perchild.c +++ b/server/mpm/experimental/perchild/perchild.c @@ -222,10 +222,19 @@ AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) *result = ap_max_daemons_limit; return APR_SUCCESS; case AP_MPMQ_IS_THREADED: - *result = 1; + *result = AP_MPMQ_DYNAMIC; return APR_SUCCESS; case AP_MPMQ_IS_FORKED: - *result = 1; + *result = AP_MPMQ_STATIC; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = max_threads; return APR_SUCCESS; } return APR_ENOTIMPL; diff --git a/server/mpm/perchild/mpm.h b/server/mpm/perchild/mpm.h index d360ae67d6e..d24f8b4abaa 100644 --- a/server/mpm/perchild/mpm.h +++ b/server/mpm/perchild/mpm.h @@ -65,6 +65,8 @@ #define PERCHILD_MPM +#define MPM_NAME "Perchild" + #define AP_MPM_NEEDS_RECLAIM_CHILD_PROCESSES 1 #define MPM_SYNC_CHILD_TABLE() #define MPM_CHILD_PID(i) (ap_child_table[i].pid) diff --git a/server/mpm/perchild/perchild.c b/server/mpm/perchild/perchild.c index 425d7eccee9..4555bb11ceb 100644 --- a/server/mpm/perchild/perchild.c +++ b/server/mpm/perchild/perchild.c @@ -222,10 +222,19 @@ AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) *result = ap_max_daemons_limit; return APR_SUCCESS; case AP_MPMQ_IS_THREADED: - *result = 1; + *result = AP_MPMQ_DYNAMIC; return APR_SUCCESS; case AP_MPMQ_IS_FORKED: - *result = 1; + *result = AP_MPMQ_STATIC; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = max_threads; return APR_SUCCESS; } return APR_ENOTIMPL; diff --git a/server/mpm/prefork/mpm.h b/server/mpm/prefork/mpm.h index debd270e253..6a923b06363 100644 --- a/server/mpm/prefork/mpm.h +++ b/server/mpm/prefork/mpm.h @@ -66,6 +66,8 @@ #define PREFORK_MPM +#define MPM_NAME "Prefork" + #define AP_MPM_NEEDS_RECLAIM_CHILD_PROCESSES 1 #define MPM_SYNC_CHILD_TABLE() (ap_sync_scoreboard_image()) #define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c index b6f6696ad98..a8d6da354f7 100644 --- a/server/mpm/prefork/prefork.c +++ b/server/mpm/prefork/prefork.c @@ -310,10 +310,19 @@ AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) *result = ap_daemons_limit; return APR_SUCCESS; case AP_MPMQ_IS_THREADED: - *result = 0; + *result = AP_MPMQ_NOT_SUPPORTED; return APR_SUCCESS; case AP_MPMQ_IS_FORKED: - *result = 1; + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = 0; return APR_SUCCESS; } return APR_ENOTIMPL; diff --git a/server/mpm/spmt_os2/mpm.h b/server/mpm/spmt_os2/mpm.h index 13b0cf5979d..96062ed7d6e 100644 --- a/server/mpm/spmt_os2/mpm.h +++ b/server/mpm/spmt_os2/mpm.h @@ -65,6 +65,8 @@ #include "mpm_default.h" #include "scoreboard.h" +#define MPM_NAME "SPMT_OS2" + extern char ap_coredump_dir[MAX_STRING_LEN]; extern server_rec *ap_server_conf; extern int ap_threads_per_child; diff --git a/server/mpm/spmt_os2/spmt_os2.c b/server/mpm/spmt_os2/spmt_os2.c index b796fb2eaa0..b991c9df368 100644 --- a/server/mpm/spmt_os2/spmt_os2.c +++ b/server/mpm/spmt_os2/spmt_os2.c @@ -885,10 +885,19 @@ AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) *result = max_daemons_limit; return APR_SUCCESS; case AP_MPMQ_IS_THREADED: - *result = 1; + *result = AP_MPMQ_DYNAMIC; return APR_SUCCESS; case AP_MPMQ_IS_FORKED: - *result = 0; + *result = AP_MPMQ_NOT_SUPPORTED; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = ap_threads_per_child; return APR_SUCCESS; } return APR_ENOTIMPL; diff --git a/server/mpm/threaded/mpm.h b/server/mpm/threaded/mpm.h index a6ea915e628..3359f8cca5f 100644 --- a/server/mpm/threaded/mpm.h +++ b/server/mpm/threaded/mpm.h @@ -63,6 +63,8 @@ #define THREADED_MPM +#define MPM_NAME "Threaded" + #define AP_MPM_NEEDS_RECLAIM_CHILD_PROCESSES 1 #define MPM_SYNC_CHILD_TABLE() (ap_sync_scoreboard_image()) #define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) diff --git a/server/mpm/threaded/threaded.c b/server/mpm/threaded/threaded.c index 1a9415912fd..ba7b2bb2abf 100644 --- a/server/mpm/threaded/threaded.c +++ b/server/mpm/threaded/threaded.c @@ -178,10 +178,19 @@ AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) *result = ap_max_daemons_limit; return APR_SUCCESS; case AP_MPMQ_IS_THREADED: - *result = 1; + *result = AP_MPMQ_STATIC; return APR_SUCCESS; case AP_MPMQ_IS_FORKED: - *result = 1; + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = ap_threads_per_child; return APR_SUCCESS; } return APR_ENOTIMPL; diff --git a/server/mpm/winnt/mpm.h b/server/mpm/winnt/mpm.h index f5215b386a7..4c17b8a55f8 100644 --- a/server/mpm/winnt/mpm.h +++ b/server/mpm/winnt/mpm.h @@ -63,6 +63,9 @@ * shared with non-mpm specific code in the server. Hummm, perhaps we can * move most of this stuff to mpm_common.h? */ + +#define MPM_NAME "WinNT" + extern int ap_threads_per_child; #endif /* APACHE_MPM_H */ diff --git a/server/mpm/winnt/mpm_winnt.c b/server/mpm/winnt/mpm_winnt.c index 0ee41a9dd26..921e362ddd4 100644 --- a/server/mpm/winnt/mpm_winnt.c +++ b/server/mpm/winnt/mpm_winnt.c @@ -1538,10 +1538,19 @@ AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) *result = MAXIMUM_WAIT_OBJECTS; return APR_SUCCESS; case AP_MPMQ_IS_THREADED: - *result = 1; + *result = AP_MPMQ_STATIC; return APR_SUCCESS; case AP_MPMQ_IS_FORKED: - *result = 0; + *result = AP_MPMQ_NOT_SUPPORTED; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = ap_threads_per_child; return APR_SUCCESS; } return APR_ENOTIMPL;