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:
5
CHANGES
5
CHANGES
@@ -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.
|
||||||
|
@@ -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
|
||||||
|
@@ -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 "
|
"<tt>connection: %d "
|
||||||
"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> "
|
||||||
|
@@ -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;
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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)
|
||||||
|
@@ -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.
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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;
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user