1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-08 15:02:10 +03:00

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 <jtravis@covalent.net>


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@88437 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Ryan Bloom
2001-03-02 22:46:33 +00:00
parent 072df7960c
commit d2d23882af
12 changed files with 132 additions and 31 deletions

View File

@@ -1,5 +1,10 @@
Changes with Apache 2.0.14-dev 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 <jtravis@covalent.net>]
*) Modify mod_include to send blocks of data no larger than 9k. *) Modify mod_include to send blocks of data no larger than 9k.
Without this, mod_include will wait until the whole file is parsed, 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. or the first tag is found to send any data to the client.

View File

@@ -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); 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 * Spawn a process with privileges that another module has requested
* @param r The request_rec of the current request * @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); 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 #endif

View File

@@ -97,6 +97,7 @@
#include "apr_lib.h" #include "apr_lib.h"
#define APR_WANT_STRFUNC #define APR_WANT_STRFUNC
#include "apr_want.h" #include "apr_want.h"
#include "ap_mpm.h"
typedef struct { typedef struct {
const char *name; /* matching module name */ const char *name; /* matching module name */
@@ -305,6 +306,8 @@ static int display_info(request_rec *r)
} }
if (!r->args || !strcasecmp(r->args, "server")) { if (!r->args || !strcasecmp(r->args, "server")) {
int max_daemons, forked, threaded;
ap_rprintf(r, "<a name=\"server\"><strong>Server Version:</strong> " ap_rprintf(r, "<a name=\"server\"><strong>Server Version:</strong> "
"<font size=+1><tt>%s</tt></a></font><br>\n", "<font size=+1><tt>%s</tt></a></font><br>\n",
ap_get_server_version()); ap_get_server_version());
@@ -321,6 +324,13 @@ static int display_info(request_rec *r)
"<tt>connection: %d &nbsp;&nbsp; " "<tt>connection: %d &nbsp;&nbsp; "
"keep-alive: %d</tt><br>", "keep-alive: %d</tt><br>",
serv->timeout, serv->keep_alive_timeout); 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, "<strong>MPM Information:</strong> "
"<tt>Max Daemons: %d Threaded: %s Forked: %s</tt><br>\n",
max_daemons, threaded ? "yes" : "no",
forked ? "yes" : "no");
ap_rprintf(r, "<strong>Server Root:</strong> " ap_rprintf(r, "<strong>Server Root:</strong> "
"<tt>%s</tt><br>\n", ap_server_root); "<tt>%s</tt><br>\n", ap_server_root);
ap_rprintf(r, "<strong>Config File:</strong> " ap_rprintf(r, "<strong>Config File:</strong> "

View File

@@ -140,11 +140,6 @@ static int one_process = 0;
int raise_sigstop_flags; int raise_sigstop_flags;
#endif #endif
AP_DECLARE(int) ap_get_max_daemons(void)
{
return ap_max_child_assigned;
}
/* a clean exit from a child with proper cleanup /* 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) __attribute__ ((noreturn)); */
static void clean_child_exit(int code) 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 ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
{ {
int remaining_threads_to_start, i,j; int remaining_threads_to_start, i,j;

View File

@@ -215,9 +215,20 @@ static apr_lock_t *process_accept_mutex;
static const char *lock_fname; static const char *lock_fname;
static apr_lock_t *thread_accept_mutex; 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 */ /* a clean exit from a child with proper cleanup */

View File

@@ -215,9 +215,20 @@ static apr_lock_t *process_accept_mutex;
static const char *lock_fname; static const char *lock_fname;
static apr_lock_t *thread_accept_mutex; 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 */ /* a clean exit from a child with proper cleanup */

View File

@@ -302,9 +302,20 @@ static void accept_mutex_off(void)
#define SAFE_ACCEPT(stmt) do {stmt;} while(0) #define SAFE_ACCEPT(stmt) do {stmt;} while(0)
#endif #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) #if defined(NEED_WAITPID)

View File

@@ -217,11 +217,6 @@ static void accept_mutex_off(void)
#define SAFE_ACCEPT(stmt) do {stmt;} while(0) #define SAFE_ACCEPT(stmt) do {stmt;} while(0)
#endif #endif
AP_DECLARE(int) ap_get_max_daemons(void)
{
return max_daemons_limit;
}
static int find_thread_by_tid(int tid) static int find_thread_by_tid(int tid)
{ {
int i; 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. * Executive routines.

View File

@@ -171,9 +171,20 @@ static const char *lock_fname;
#define SAFE_ACCEPT(stmt) (stmt) #define SAFE_ACCEPT(stmt) (stmt)
#endif #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 */ /* a clean exit from a child with proper cleanup */

View File

@@ -126,10 +126,6 @@ DWORD parent_pid;
* code * code
*/ */
ap_generation_t volatile ap_my_generation=0; /* Used by the scoreboard */ 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 /* This is the helper code to resolve late bound entry points
* missing from one or more releases of the Win32 API... * 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. * 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 apr_status_t service_to_start_success;
static int inst_argc; static int inst_argc;
static const char * const *inst_argv; static const char * const *inst_argv;

View File

@@ -94,8 +94,9 @@ void ap_reclaim_child_processes(int terminate)
apr_status_t waitret; apr_status_t waitret;
int tries; int tries;
int not_dead_yet; 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(); MPM_SYNC_CHILD_TABLE();
for (tries = terminate ? 4 : 1; tries <= 9; ++tries) { for (tries = terminate ? 4 : 1; tries <= 9; ++tries) {

View File

@@ -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) AP_DECLARE(int) find_child_by_pid(apr_proc_t *pid)
{ {
int i; 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) for (i = 0; i < max_daemons_limit; ++i)
if (ap_scoreboard_image->parent[i].pid == pid->pid) if (ap_scoreboard_image->parent[i].pid == pid->pid)