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
*) 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.
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.

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);
/**
* 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

View File

@@ -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, "<a name=\"server\"><strong>Server Version:</strong> "
"<font size=+1><tt>%s</tt></a></font><br>\n",
ap_get_server_version());
@@ -321,6 +324,13 @@ static int display_info(request_rec *r)
"<tt>connection: %d &nbsp;&nbsp; "
"keep-alive: %d</tt><br>",
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> "
"<tt>%s</tt><br>\n", ap_server_root);
ap_rprintf(r, "<strong>Config File:</strong> "

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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)

View File

@@ -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.

View File

@@ -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 */

View File

@@ -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;

View File

@@ -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) {

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)
{
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)