Commit 86fa0cb0 authored by Ryan Bloom's avatar Ryan Bloom
Browse files

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
parent 68a1dad0
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
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.
+13 −7
Original line number Diff line number Diff line
@@ -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
+10 −0
Original line number Diff line number Diff line
@@ -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> "
+16 −5
Original line number Diff line number Diff line
@@ -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;
+13 −2
Original line number Diff line number Diff line
@@ -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 */
Loading