From cd0738be95d681141d961f5aa5c6a5dcdb9ef847 Mon Sep 17 00:00:00 2001 From: Ryan Bloom Date: Fri, 13 Apr 2001 19:00:39 +0000 Subject: [PATCH] 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 --- include/ap_mpm.h | 19 ++++++++++++++++--- modules/generators/mod_info.c | 1 + server/config.c | 5 +++++ server/mpm/beos/beos.c | 13 +++++++++++-- server/mpm/beos/mpm.h | 1 + server/mpm/experimental/perchild/mpm.h | 2 ++ server/mpm/experimental/perchild/perchild.c | 13 +++++++++++-- server/mpm/perchild/mpm.h | 2 ++ server/mpm/perchild/perchild.c | 13 +++++++++++-- server/mpm/prefork/mpm.h | 2 ++ server/mpm/prefork/prefork.c | 13 +++++++++++-- server/mpm/spmt_os2/mpm.h | 2 ++ server/mpm/spmt_os2/spmt_os2.c | 13 +++++++++++-- server/mpm/threaded/mpm.h | 2 ++ server/mpm/threaded/threaded.c | 13 +++++++++++-- server/mpm/winnt/mpm.h | 3 +++ server/mpm/winnt/mpm_winnt.c | 13 +++++++++++-- 17 files changed, 113 insertions(+), 17 deletions(-) diff --git a/include/ap_mpm.h b/include/ap_mpm.h index 549faf71cc..8072c823d8 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 cfe57e2991..3c5e014fcf 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 bf52650d85..8391140f21 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 2ad631cc59..c0128df9b5 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 e6de276556..3a652f0502 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 d360ae67d6..d24f8b4aba 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 425d7eccee..4555bb11ce 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 d360ae67d6..d24f8b4aba 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 425d7eccee..4555bb11ce 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 debd270e25..6a923b0636 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 b6f6696ad9..a8d6da354f 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 13b0cf5979..96062ed7d6 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 b796fb2eaa..b991c9df36 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 a6ea915e62..3359f8cca5 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 1a9415912f..ba7b2bb2ab 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 f5215b386a..4c17b8a55f 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 0ee41a9dd2..921e362ddd 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; -- 2.50.1