You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by tr...@apache.org on 2009/03/24 16:44:25 UTC
svn commit: r757853 [1/2] - in /httpd/httpd/trunk: ./ include/
modules/generators/ modules/ssl/ server/ server/mpm/
server/mpm/experimental/event/ server/mpm/prefork/ server/mpm/simple/
server/mpm/winnt/ server/mpm/worker/
Author: trawick
Date: Tue Mar 24 15:43:59 2009
New Revision: 757853
URL: http://svn.apache.org/viewvc?rev=757853&view=rev
Log:
Introduce a new set of APIs to allow MPMs to be proper modules instead
of integral parts which share global variables, functions, and macros
with the rest of httpd.
Converted now:
prefork, worker, event, simple, WinNT*
*WinNT hasn't been built or tested, and relies on a hack to include the
WinNT mpm.h to disable Unixy MPM support routines in mpm_common.c
Removed:
httpd/httpd/trunk/server/mpm/experimental/event/mpm.h
httpd/httpd/trunk/server/mpm/prefork/mpm.h
httpd/httpd/trunk/server/mpm/simple/mpm.h
httpd/httpd/trunk/server/mpm/worker/mpm.h
Modified:
httpd/httpd/trunk/configure.in
httpd/httpd/trunk/include/ap_mpm.h
httpd/httpd/trunk/include/http_main.h
httpd/httpd/trunk/include/mpm_common.h
httpd/httpd/trunk/modules/generators/mod_status.c
httpd/httpd/trunk/modules/ssl/ssl_private.h
httpd/httpd/trunk/server/config.c
httpd/httpd/trunk/server/connection.c
httpd/httpd/trunk/server/core.c
httpd/httpd/trunk/server/core_filters.c
httpd/httpd/trunk/server/listen.c
httpd/httpd/trunk/server/main.c
httpd/httpd/trunk/server/mpm/config.m4
httpd/httpd/trunk/server/mpm/experimental/event/event.c
httpd/httpd/trunk/server/mpm/experimental/event/pod.c
httpd/httpd/trunk/server/mpm/experimental/event/pod.h
httpd/httpd/trunk/server/mpm/prefork/prefork.c
httpd/httpd/trunk/server/mpm/simple/simple_api.c
httpd/httpd/trunk/server/mpm/winnt/mpm.h
httpd/httpd/trunk/server/mpm/winnt/mpm_winnt.c
httpd/httpd/trunk/server/mpm/worker/pod.c
httpd/httpd/trunk/server/mpm/worker/pod.h
httpd/httpd/trunk/server/mpm/worker/worker.c
httpd/httpd/trunk/server/mpm_common.c
httpd/httpd/trunk/server/scoreboard.c
Modified: httpd/httpd/trunk/configure.in
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/configure.in?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/configure.in (original)
+++ httpd/httpd/trunk/configure.in Tue Mar 24 15:43:59 2009
@@ -211,7 +211,7 @@
APR_ADDTO(INCLUDES, [-I\$(top_builddir)/include])
fi
-APR_ADDTO(INCLUDES, [-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/server/mpm/\$(MPM_SUBDIR_NAME) -I\$(top_srcdir)/modules/http -I\$(top_srcdir)/modules/aaa -I\$(top_srcdir)/modules/filters -I\$(top_srcdir)/modules/proxy -I\$(top_srcdir)/modules/session -I\$(top_srcdir)/include -I\$(top_srcdir)/modules/generators -I\$(top_srcdir)/modules/mappers -I\$(top_srcdir)/modules/database])
+APR_ADDTO(INCLUDES, [-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/modules/http -I\$(top_srcdir)/modules/aaa -I\$(top_srcdir)/modules/filters -I\$(top_srcdir)/modules/proxy -I\$(top_srcdir)/modules/session -I\$(top_srcdir)/include -I\$(top_srcdir)/modules/generators -I\$(top_srcdir)/modules/mappers -I\$(top_srcdir)/modules/database])
# apr/apr-util --includes may pick up system paths for dependent
# libraries, so ensure these are later in INCLUDES than local source
Modified: httpd/httpd/trunk/include/ap_mpm.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_mpm.h?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/include/ap_mpm.h (original)
+++ httpd/httpd/trunk/include/ap_mpm.h Tue Mar 24 15:43:59 2009
@@ -27,6 +27,7 @@
#define AP_MPM_H
#include "apr_thread_proc.h"
+#include "httpd.h"
#ifdef __cplusplus
extern "C" {
@@ -79,9 +80,9 @@
*/
/**
- * This is the function that MPMs must create. This function is responsible
- * for controlling the parent and child processes. It will run until a
- * restart/shutdown is indicated.
+ * This is the function that passes control to the MPM for steady-state
+ * processing. It is responsible for controlling the parent and child
+ * processes. It will run until a restart/shutdown is indicated.
* @param pconf the configuration pool, reset before the config file is read
* @param plog the log pool, reset after the config file is read
* @param server_conf the global server config.
@@ -142,6 +143,7 @@
#define AP_MPMQ_MAX_DAEMONS 12 /* Max # of daemons by config */
#define AP_MPMQ_MPM_STATE 13 /* starting, running, stopping */
#define AP_MPMQ_IS_ASYNC 14 /* MPM can process async connections */
+#define AP_MPMQ_GENERATION 15 /* MPM generation */
/**
* Query a property of the current MPM.
@@ -155,10 +157,10 @@
typedef void (ap_mpm_callback_fn_t)(void *baton);
-/* XXXXXXX: only added support in the Event MPM.... */
-AP_DECLARE(void) ap_mpm_register_timed_callback(apr_time_t t,
- ap_mpm_callback_fn_t *cbfn,
- void *baton);
+/* only added support in the Event MPM.... check for APR_ENOTIMPL */
+AP_DECLARE(apr_status_t) ap_mpm_register_timed_callback(apr_time_t t,
+ ap_mpm_callback_fn_t *cbfn,
+ void *baton);
/* Defining GPROF when compiling uses the moncontrol() function to
* disable gprof profiling in the parent, and enable it only for
Modified: httpd/httpd/trunk/include/http_main.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/http_main.h?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/include/http_main.h (original)
+++ httpd/httpd/trunk/include/http_main.h Tue Mar 24 15:43:59 2009
@@ -26,6 +26,7 @@
#ifndef APACHE_HTTP_MAIN_H
#define APACHE_HTTP_MAIN_H
+#include "httpd.h"
#include "apr_optional.h"
/** AP_SERVER_BASEARGS is the command argument list parsed by http_main.c
@@ -42,6 +43,8 @@
AP_DECLARE_DATA extern const char *ap_server_argv0;
/** The global server's ServerRoot */
AP_DECLARE_DATA extern const char *ap_server_root;
+/** The global server's server_rec */
+AP_DECLARE_DATA extern server_rec *ap_server_conf;
/* for -C, -c and -D switches */
/** An array of all -C directives. These are processed before the server's
Modified: httpd/httpd/trunk/include/mpm_common.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/mpm_common.h?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/include/mpm_common.h (original)
+++ httpd/httpd/trunk/include/mpm_common.h Tue Mar 24 15:43:59 2009
@@ -38,12 +38,22 @@
#define APACHE_MPM_COMMON_H
#include "ap_config.h"
+#include "ap_mpm.h"
#if APR_HAVE_NETINET_TCP_H
#include <netinet/tcp.h> /* for TCP_NODELAY */
#endif
+#ifdef WIN32
+/* XXX temporary mitigation for Windows; other non-Unix MPMs need this hack too
+ * include mpm.h to pick up the AP_MPM_NO_foo definitions
+ */
#include "mpm.h"
+#endif
+
+#ifndef AP_MPM_NO_SET_ACCEPT_LOCK_MECH
+#include "apr_proc_mutex.h"
+#endif
#ifdef __cplusplus
extern "C" {
@@ -95,7 +105,7 @@
* in the scoreboard as well as those currently registered via
* ap_register_extra_mpm_process().
*/
-#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES
+#ifndef AP_MPM_NO_RECLAIM_CHILD_PROCESSES
void ap_reclaim_child_processes(int terminate);
#endif
@@ -112,7 +122,7 @@
* in the scoreboard as well as those currently registered via
* ap_register_extra_mpm_process().
*/
-#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES
+#ifndef AP_MPM_NO_RECLAIM_CHILD_PROCESSES
void ap_relieve_child_processes(void);
#endif
@@ -127,7 +137,7 @@
* ap_reclaim_child_processes(), remove it from the list of such processes
* by calling ap_unregister_extra_mpm_process().
*/
-#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES
+#ifndef AP_MPM_NO_RECLAIM_CHILD_PROCESSES
void ap_register_extra_mpm_process(pid_t pid);
#endif
@@ -140,7 +150,7 @@
* be reclaimed.
* @return 1 if the process was found and removed, 0 otherwise
*/
-#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES
+#ifndef AP_MPM_NO_RECLAIM_CHILD_PROCESSES
int ap_unregister_extra_mpm_process(pid_t pid);
#endif
@@ -153,7 +163,7 @@
* APR_EINVAL is returned if passed either an invalid (< 1) pid, or if
* the pid is not in the current process group
*/
-#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES
+#ifndef AP_MPM_NO_RECLAIM_CHILD_PROCESSES
apr_status_t ap_mpm_safe_kill(pid_t pid, int sig);
#endif
@@ -165,7 +175,7 @@
* @param ret The process id of the process that died
* @param p The pool to allocate out of
*/
-#ifdef AP_MPM_WANT_WAIT_OR_TIMEOUT
+#ifndef AP_MPM_NO_WAIT_OR_TIMEOUT
void ap_wait_or_timeout(apr_exit_why_e *status, int *exitcode, apr_proc_t *ret,
apr_pool_t *p);
#endif
@@ -177,7 +187,7 @@
* @param status The status returned from ap_wait_or_timeout
* @return 0 on success, APEXIT_CHILDFATAL if MPM should terminate
*/
-#ifdef AP_MPM_WANT_PROCESS_CHILD_STATUS
+#ifndef AP_MPM_NO_PROCESS_CHILD_STATUS
int ap_process_child_status(apr_proc_t *pid, apr_exit_why_e why, int status);
#endif
@@ -216,7 +226,7 @@
#define AP_MPM_HARD_LIMITS_FILE APACHE_MPM_DIR "/mpm_default.h"
-#ifdef AP_MPM_USES_POD
+#ifndef AP_MPM_NO_POD
typedef struct ap_pod_t ap_pod_t;
@@ -270,7 +280,7 @@
* The maximum number of requests each child thread or
* process handles before dying off
*/
-#ifdef AP_MPM_WANT_SET_MAX_REQUESTS
+#ifndef AP_MPM_NO_SET_MAX_REQUESTS
extern int ap_max_requests_per_child;
const char *ap_mpm_set_max_requests(cmd_parms *cmd, void *dummy,
const char *arg);
@@ -279,7 +289,7 @@
/**
* The filename used to store the process id.
*/
-#ifdef AP_MPM_WANT_SET_PIDFILE
+#ifndef AP_MPM_NO_SET_PIDFILE
extern const char *ap_pid_fname;
const char *ap_mpm_set_pidfile(cmd_parms *cmd, void *dummy,
const char *arg);
@@ -288,7 +298,7 @@
/**
* The name of lockfile used when Apache needs to lock the accept() call.
*/
-#ifdef AP_MPM_WANT_SET_LOCKFILE
+#ifndef AP_MPM_NO_SET_LOCKFILE
extern const char *ap_lock_fname;
const char *ap_mpm_set_lockfile(cmd_parms *cmd, void *dummy,
const char *arg);
@@ -297,7 +307,7 @@
/**
* The system mutex implementation to use for the accept mutex.
*/
-#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH
+#ifndef AP_MPM_NO_SET_ACCEPT_LOCK_MECH
extern apr_lockmech_e ap_accept_lock_mech;
const char *ap_mpm_set_accept_lock_mech(cmd_parms *cmd, void *dummy,
const char *arg);
@@ -306,7 +316,7 @@
/*
* Set the scorboard file.
*/
-#ifdef AP_MPM_WANT_SET_SCOREBOARD
+#ifndef AP_MPM_NO_SET_SCOREBOARD
const char *ap_mpm_set_scoreboard(cmd_parms *cmd, void *dummy,
const char *arg);
#endif
@@ -314,7 +324,7 @@
/*
* The directory that the server changes directory to dump core.
*/
-#ifdef AP_MPM_WANT_SET_COREDUMPDIR
+#ifndef AP_MPM_NO_SET_COREDUMPDIR
extern char ap_coredump_dir[MAX_STRING_LEN];
extern int ap_coredumpdir_configured;
const char *ap_mpm_set_coredumpdir(cmd_parms *cmd, void *dummy,
@@ -324,7 +334,7 @@
/**
* Set the timeout period for a graceful shutdown.
*/
-#ifdef AP_MPM_WANT_SET_GRACEFUL_SHUTDOWN
+#ifndef AP_MPM_NO_SET_GRACEFUL_SHUTDOWN
extern int ap_graceful_shutdown_timeout;
const char *ap_mpm_set_graceful_shutdown(cmd_parms *cmd, void *dummy,
const char *arg);
@@ -335,24 +345,24 @@
#endif
-#ifdef AP_MPM_WANT_SIGNAL_SERVER
+#ifndef AP_MPM_NO_SIGNAL_SERVER
int ap_signal_server(int *, apr_pool_t *);
void ap_mpm_rewrite_args(process_rec *);
#endif
-#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE
+#ifndef AP_MPM_NO_SET_MAX_MEM_FREE
extern apr_uint32_t ap_max_mem_free;
extern const char *ap_mpm_set_max_mem_free(cmd_parms *cmd, void *dummy,
const char *arg);
#endif
-#ifdef AP_MPM_WANT_SET_STACKSIZE
+#ifndef AP_MPM_NO_SET_STACKSIZE
extern apr_size_t ap_thread_stacksize;
extern const char *ap_mpm_set_thread_stacksize(cmd_parms *cmd, void *dummy,
const char *arg);
#endif
-#ifdef AP_MPM_WANT_FATAL_SIGNAL_HANDLER
+#ifndef AP_MPM_NO_FATAL_SIGNAL_HANDLER
extern apr_status_t ap_fatal_signal_setup(server_rec *s, apr_pool_t *pconf);
extern apr_status_t ap_fatal_signal_child_setup(server_rec *s);
#endif
@@ -362,12 +372,33 @@
const char *arg);
#endif
+#ifndef AP_MPM_NO_CHILD_PID
+extern pid_t ap_mpm_get_child_pid(int childnum);
+extern pid_t ap_mpm_note_child_killed(int childnum);
+#endif
+
AP_DECLARE_HOOK(int,monitor,(apr_pool_t *p))
/* register modules that undertake to manage system security */
AP_DECLARE(int) ap_sys_privileges_handlers(int inc);
AP_DECLARE_HOOK(int, drop_privileges, (apr_pool_t * pchild, server_rec * s))
+/* pass control to the MPM */
+AP_DECLARE_HOOK(int, mpm, (apr_pool_t *pconf, apr_pool_t *plog, server_rec *s));
+
+/* implement the mpm query function */
+AP_DECLARE_HOOK(apr_status_t, mpm_query, (int query_code, int *result));
+
+/* get pid of child by index */
+AP_DECLARE_HOOK(pid_t, mpm_get_child_pid, (int childnum));
+
+/* child specified by index has been killed */
+AP_DECLARE_HOOK(apr_status_t, mpm_note_child_killed, (int childnum));
+
+/* register the specified callback */
+AP_DECLARE_HOOK(apr_status_t, mpm_register_timed_callback,
+ (apr_time_t t, ap_mpm_callback_fn_t *cbfn, void *baton));
+
#ifdef __cplusplus
}
#endif
Modified: httpd/httpd/trunk/modules/generators/mod_status.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/generators/mod_status.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/generators/mod_status.c (original)
+++ httpd/httpd/trunk/modules/generators/mod_status.c Tue Mar 24 15:43:59 2009
@@ -245,13 +245,15 @@
char *stat_buffer;
pid_t *pid_buffer, worker_pid;
clock_t tu, ts, tcu, tcs;
- ap_generation_t worker_generation;
+ ap_generation_t mpm_generation, worker_generation;
if (strcmp(r->handler, STATUS_MAGIC_TYPE) &&
strcmp(r->handler, "server-status")) {
return DECLINED;
}
+ ap_mpm_query(AP_MPMQ_GENERATION, &mpm_generation);
+
#ifdef HAVE_TIMES
#ifdef _SC_CLK_TCK
tick = sysconf(_SC_CLK_TCK);
@@ -339,7 +341,7 @@
if (!ps_record->quiescing
&& ps_record->pid) {
if (res == SERVER_READY
- && ps_record->generation == ap_my_generation)
+ && ps_record->generation == mpm_generation)
ready++;
else if (res != SERVER_DEAD &&
res != SERVER_STARTING &&
@@ -422,7 +424,7 @@
DEFAULT_TIME_FORMAT, 0),
"</dt>\n", NULL);
ap_rprintf(r, "<dt>Parent Server Generation: %d</dt>\n",
- (int)ap_my_generation);
+ (int)mpm_generation);
ap_rputs("<dt>Server uptime: ", r);
show_time(r, up_time);
ap_rputs("</dt>\n", r);
Modified: httpd/httpd/trunk/modules/ssl/ssl_private.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_private.h?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/ssl/ssl_private.h (original)
+++ httpd/httpd/trunk/modules/ssl/ssl_private.h Tue Mar 24 15:43:59 2009
@@ -39,7 +39,6 @@
#include "util_script.h"
#include "util_filter.h"
#include "util_ebcdic.h"
-#include "mpm.h"
#include "apr.h"
#include "apr_strings.h"
#define APR_WANT_STRFUNC
Modified: httpd/httpd/trunk/server/config.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/config.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/config.c (original)
+++ httpd/httpd/trunk/server/config.c Tue Mar 24 15:43:59 2009
@@ -49,12 +49,10 @@
#include "http_main.h"
#include "http_vhost.h"
#include "util_cfgtree.h"
-#include "mpm.h"
-
AP_DECLARE_DATA const char *ap_server_argv0 = NULL;
-
AP_DECLARE_DATA const char *ap_server_root = NULL;
+AP_DECLARE_DATA server_rec *ap_server_conf = NULL;
AP_DECLARE_DATA apr_array_header_t *ap_server_pre_read_config = NULL;
AP_DECLARE_DATA apr_array_header_t *ap_server_post_read_config = NULL;
@@ -2195,7 +2193,3 @@
printf(" %s\n", ap_loaded_modules[n]->name);
}
-AP_DECLARE(const char *) ap_show_mpm(void)
-{
- return MPM_NAME;
-}
Modified: httpd/httpd/trunk/server/connection.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/connection.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/connection.c (original)
+++ httpd/httpd/trunk/server/connection.c Tue Mar 24 15:43:59 2009
@@ -23,7 +23,6 @@
#include "http_request.h"
#include "http_protocol.h"
#include "ap_mpm.h"
-#include "mpm_default.h"
#include "http_config.h"
#include "http_core.h"
#include "http_vhost.h"
Modified: httpd/httpd/trunk/server/core.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/core.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/core.c (original)
+++ httpd/httpd/trunk/server/core.c Tue Mar 24 15:43:59 2009
@@ -42,7 +42,6 @@
#include "util_filter.h"
#include "util_ebcdic.h"
#include "util_mutex.h"
-#include "mpm.h"
#include "mpm_common.h"
#include "scoreboard.h"
#include "mod_core.h"
Modified: httpd/httpd/trunk/server/core_filters.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/core_filters.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/core_filters.c (original)
+++ httpd/httpd/trunk/server/core_filters.c Tue Mar 24 15:43:59 2009
@@ -46,7 +46,6 @@
#include "apr_buckets.h"
#include "util_filter.h"
#include "util_ebcdic.h"
-#include "mpm.h"
#include "mpm_common.h"
#include "scoreboard.h"
#include "mod_core.h"
Modified: httpd/httpd/trunk/server/listen.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/listen.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/listen.c (original)
+++ httpd/httpd/trunk/server/listen.c Tue Mar 24 15:43:59 2009
@@ -26,7 +26,6 @@
#include "http_core.h"
#include "ap_listen.h"
#include "http_log.h"
-#include "mpm.h"
#include "mpm_common.h"
AP_DECLARE_DATA ap_listen_rec *ap_listeners = NULL;
@@ -169,11 +168,7 @@
server->sd = s;
server->active = 1;
-#ifdef MPM_ACCEPT_FUNC
- server->accept_func = MPM_ACCEPT_FUNC;
-#else
server->accept_func = NULL;
-#endif
return APR_SUCCESS;
}
Modified: httpd/httpd/trunk/server/main.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/main.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/main.c (original)
+++ httpd/httpd/trunk/server/main.c Tue Mar 24 15:43:59 2009
@@ -52,6 +52,9 @@
* Most significant main() global data can be found in http_config.c
*/
+/* XXX call after module loading based on some cmd-line option/define
+ */
+
static void show_mpm_settings(void)
{
int mpm_query_info;
@@ -108,8 +111,6 @@
*/
printf("Architecture: %ld-bit\n", 8 * (long)sizeof(void *));
- show_mpm_settings();
-
printf("Server compiled with....\n");
#ifdef BIG_SECURITY_HOLE
printf(" -D BIG_SECURITY_HOLE\n");
@@ -706,6 +707,7 @@
apr_pool_clear(plog);
+ ap_server_conf = server_conf;
if ( ap_run_open_logs(pconf, plog, ptemp, server_conf) != OK) {
ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
0, NULL, "Unable to open logs");
Modified: httpd/httpd/trunk/server/mpm/config.m4
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/config.m4?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/config.m4 (original)
+++ httpd/httpd/trunk/server/mpm/config.m4 Tue Mar 24 15:43:59 2009
@@ -69,10 +69,6 @@
MPM_DIR=server/mpm/$MPM_SUBDIR_NAME
MPM_LIB=$MPM_DIR/lib${MPM_NAME}.la
-if test ! -f "$abs_srcdir/$MPM_DIR/mpm.h"; then
- AC_MSG_ERROR(the selected mpm -- $apache_cv_mpm -- is not supported)
-fi
-
APACHE_SUBST(MPM_NAME)
APACHE_SUBST(MPM_SUBDIR_NAME)
MODLIST="$MODLIST mpm_${MPM_NAME}"
Modified: httpd/httpd/trunk/server/mpm/experimental/event/event.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/experimental/event/event.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/experimental/event/event.c (original)
+++ httpd/httpd/trunk/server/mpm/experimental/event/event.c Tue Mar 24 15:43:59 2009
@@ -90,6 +90,7 @@
#include "fdqueue.h"
#include "mpm_default.h"
#include "http_vhost.h"
+#include "unixd.h"
#include <signal.h>
#include <limits.h> /* for INT_MAX */
@@ -134,11 +135,13 @@
#define MAX_THREAD_LIMIT 100000
#endif
+#define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid)
+
/*
* Actual definitions of config globals
*/
-int ap_threads_per_child = 0; /* Worker threads per child */
+static int threads_per_child = 0; /* Worker threads per child */
static int ap_daemons_to_start = 0;
static int min_spare_threads = 0;
static int max_spare_threads = 0;
@@ -159,6 +162,7 @@
static fd_queue_info_t *worker_queue_info;
static int mpm_state = AP_MPMQ_STARTING;
static int sick_child_detected;
+static ap_generation_t volatile my_generation = 0;
static apr_thread_mutex_t *timeout_mutex;
APR_RING_HEAD(timeout_head_t, conn_state_t);
@@ -206,13 +210,9 @@
* use this value to optimize routines that have to scan the entire
* scoreboard.
*/
-int ap_max_daemons_limit = -1;
-
-static ap_pod_t *pod;
+static int max_daemons_limit = -1;
-/* *Non*-shared http_main globals... */
-
-server_rec *ap_server_conf;
+static ap_event_pod_t *pod;
/* The event MPM respects a couple of runtime flags that can aid
* in debugging. Setting the -DNO_DETACH flag will prevent the root process
@@ -257,7 +257,7 @@
static void close_worker_sockets(void)
{
int i;
- for (i = 0; i < ap_threads_per_child; i++) {
+ for (i = 0; i < threads_per_child; i++) {
if (worker_sockets[i]) {
apr_socket_close(worker_sockets[i]);
worker_sockets[i] = NULL;
@@ -322,11 +322,11 @@
}
}
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+static apr_status_t event_query(int query_code, int *result)
{
switch (query_code) {
case AP_MPMQ_MAX_DAEMON_USED:
- *result = ap_max_daemons_limit;
+ *result = max_daemons_limit;
return APR_SUCCESS;
case AP_MPMQ_IS_THREADED:
*result = AP_MPMQ_STATIC;
@@ -344,7 +344,7 @@
*result = thread_limit;
return APR_SUCCESS;
case AP_MPMQ_MAX_THREADS:
- *result = ap_threads_per_child;
+ *result = threads_per_child;
return APR_SUCCESS;
case AP_MPMQ_MIN_SPARE_DAEMONS:
*result = 0;
@@ -367,10 +367,24 @@
case AP_MPMQ_MPM_STATE:
*result = mpm_state;
return APR_SUCCESS;
+ case AP_MPMQ_GENERATION:
+ *result = my_generation;
+ return APR_SUCCESS;
}
return APR_ENOTIMPL;
}
+static pid_t event_get_child_pid(int childnum)
+{
+ return ap_scoreboard_image->parent[childnum].pid;
+}
+
+static apr_status_t event_note_child_killed(int childnum)
+{
+ ap_scoreboard_image->parent[childnum].pid = 0;
+ return APR_SUCCESS;
+}
+
/* 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)
@@ -396,7 +410,6 @@
static int volatile restart_pending;
static int volatile is_graceful;
static volatile int child_fatal;
-ap_generation_t volatile ap_my_generation = 0;
/*
* ap_start_shutdown() and ap_start_restart(), below, are a first stab at
@@ -773,7 +786,7 @@
/* Create the main pollset */
rv = apr_pollset_create(&event_pollset,
- ap_threads_per_child,
+ threads_per_child,
p, APR_POLLSET_THREADSAFE | APR_POLLSET_NOCOPY);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf,
@@ -795,6 +808,8 @@
apr_socket_opt_set(pfd->desc.s, APR_SO_NONBLOCK, 1);
apr_pollset_add(event_pollset, pfd);
+
+ lr->accept_func = ap_unixd_accept;
}
return APR_SUCCESS;
@@ -891,9 +906,9 @@
static apr_thread_mutex_t *g_timer_ring_mtx;
-AP_DECLARE(void) ap_mpm_register_timed_callback(apr_time_t t,
- ap_mpm_callback_fn_t *cbfn,
- void *baton)
+static apr_status_t event_register_timed_callback(apr_time_t t,
+ ap_mpm_callback_fn_t *cbfn,
+ void *baton)
{
int inserted = 0;
timer_event_t *ep;
@@ -934,6 +949,8 @@
}
apr_thread_mutex_unlock(g_timer_ring_mtx);
+
+ return APR_SUCCESS;
}
#ifndef apr_time_from_msec
@@ -1252,7 +1269,7 @@
ap_scoreboard_image->servers[process_slot][thread_slot].pid = ap_my_pid;
ap_scoreboard_image->servers[process_slot][thread_slot].tid = apr_os_thread_current();
- ap_scoreboard_image->servers[process_slot][thread_slot].generation = ap_my_generation;
+ ap_scoreboard_image->servers[process_slot][thread_slot].generation = my_generation;
ap_update_child_status_from_indexes(process_slot, thread_slot,
SERVER_STARTING, NULL);
@@ -1395,7 +1412,7 @@
/* We must create the fd queues before we start up the listener
* and worker threads. */
worker_queue = apr_pcalloc(pchild, sizeof(*worker_queue));
- rv = ap_queue_init(worker_queue, ap_threads_per_child, pchild);
+ rv = ap_queue_init(worker_queue, threads_per_child, pchild);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf,
"ap_queue_init() failed");
@@ -1403,20 +1420,20 @@
}
rv = ap_queue_info_create(&worker_queue_info, pchild,
- ap_threads_per_child);
+ threads_per_child);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf,
"ap_queue_info_create() failed");
clean_child_exit(APEXIT_CHILDFATAL);
}
- worker_sockets = apr_pcalloc(pchild, ap_threads_per_child
+ worker_sockets = apr_pcalloc(pchild, threads_per_child
* sizeof(apr_socket_t *));
loops = prev_threads_created = 0;
while (1) {
- /* ap_threads_per_child does not include the listener thread */
- for (i = 0; i < ap_threads_per_child; i++) {
+ /* threads_per_child does not include the listener thread */
+ for (i = 0; i < threads_per_child; i++) {
int status =
ap_scoreboard_image->servers[child_num_arg][i].status;
@@ -1458,7 +1475,7 @@
}
- if (start_thread_may_exit || threads_created == ap_threads_per_child) {
+ if (start_thread_may_exit || threads_created == threads_per_child) {
break;
}
/* wait for previous generation to clean up an entry */
@@ -1470,7 +1487,7 @@
"child %" APR_PID_T_FMT " isn't taking over "
"slots very quickly (%d of %d)",
ap_my_pid, threads_created,
- ap_threads_per_child);
+ threads_per_child);
}
prev_threads_created = threads_created;
}
@@ -1532,7 +1549,7 @@
}
}
- for (i = 0; i < ap_threads_per_child; i++) {
+ for (i = 0; i < threads_per_child; i++) {
if (threads[i]) { /* if we ever created this thread */
rv = apr_thread_join(&thread_rv, threads[i]);
if (rv != APR_SUCCESS) {
@@ -1615,7 +1632,7 @@
*/
threads = (apr_thread_t **) calloc(1,
sizeof(apr_thread_t *) *
- ap_threads_per_child);
+ threads_per_child);
if (threads == NULL) {
ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
"malloc: out of memory");
@@ -1685,7 +1702,7 @@
apr_signal(SIGTERM, dummy_signal_handler);
/* Watch for any messages from the parent over the POD */
while (1) {
- rv = ap_mpm_pod_check(pod);
+ rv = ap_event_pod_check(pod);
if (rv == AP_NORESTART) {
/* see if termination was triggered while we slept */
switch (terminate_mode) {
@@ -1727,8 +1744,8 @@
{
int pid;
- if (slot + 1 > ap_max_daemons_limit) {
- ap_max_daemons_limit = slot + 1;
+ if (slot + 1 > max_daemons_limit) {
+ max_daemons_limit = slot + 1;
}
if (one_process) {
@@ -1847,13 +1864,13 @@
for (i = 0; i < ap_daemons_limit; ++i) {
/* Initialization to satisfy the compiler. It doesn't know
- * that ap_threads_per_child is always > 0 */
+ * that threads_per_child is always > 0 */
int status = SERVER_DEAD;
int any_dying_threads = 0;
int any_dead_threads = 0;
int all_dead_threads = 1;
- if (i >= ap_max_daemons_limit
+ if (i >= max_daemons_limit
&& totally_free_length == idle_spawn_rate)
/* short cut if all active processes have been examined and
* enough empty scoreboard slots have been found
@@ -1861,7 +1878,7 @@
break;
ps = &ap_scoreboard_image->parent[i];
- for (j = 0; j < ap_threads_per_child; j++) {
+ for (j = 0; j < threads_per_child; j++) {
ws = &ap_scoreboard_image->servers[i][j];
status = ws->status;
@@ -1881,7 +1898,7 @@
if (ps->pid != 0) { /* XXX just set all_dead_threads in outer
for loop if no pid? not much else matters */
if (status <= SERVER_READY &&
- !ps->quiescing && ps->generation == ap_my_generation) {
+ !ps->quiescing && ps->generation == my_generation) {
++idle_thread_count;
}
if (status >= SERVER_READY && status < SERVER_GRACEFUL) {
@@ -1940,18 +1957,18 @@
}
}
- ap_max_daemons_limit = last_non_dead + 1;
+ max_daemons_limit = last_non_dead + 1;
if (idle_thread_count > max_spare_threads) {
/* Kill off one child */
- ap_mpm_pod_signal(pod, TRUE);
+ ap_event_pod_signal(pod, TRUE);
idle_spawn_rate = 1;
}
else if (idle_thread_count < min_spare_threads) {
/* terminate the free list */
if (free_length == 0) { /* scoreboard is full, can't fork */
- if (active_thread_count >= ap_daemons_limit * ap_threads_per_child) {
+ if (active_thread_count >= ap_daemons_limit * threads_per_child) {
static int reported = 0;
if (!reported) {
/* only report this condition once */
@@ -2029,7 +2046,7 @@
/* non-fatal death... note that it's gone in the scoreboard. */
child_slot = ap_find_child_by_pid(&pid);
if (child_slot >= 0) {
- for (i = 0; i < ap_threads_per_child; i++)
+ for (i = 0; i < threads_per_child; i++)
ap_update_child_status_from_indexes(child_slot, i,
SERVER_DEAD,
(request_rec *) NULL);
@@ -2092,7 +2109,7 @@
}
}
-int ap_mpm_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s)
+static int event_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s)
{
int remaining_children_to_start;
@@ -2106,13 +2123,13 @@
/* fix the generation number in the global score; we just got a new,
* cleared scoreboard
*/
- ap_scoreboard_image->global->running_generation = ap_my_generation;
+ ap_scoreboard_image->global->running_generation = my_generation;
}
set_signals();
/* Don't thrash... */
- if (max_spare_threads < min_spare_threads + ap_threads_per_child)
- max_spare_threads = min_spare_threads + ap_threads_per_child;
+ if (max_spare_threads < min_spare_threads + threads_per_child)
+ max_spare_threads = min_spare_threads + threads_per_child;
/* If we're doing a graceful_restart then we're going to see a lot
* of children exiting immediately when we get into the main loop
@@ -2153,7 +2170,7 @@
/* Time to shut down:
* Kill child processes, tell them to call child_exit, etc...
*/
- ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE);
+ ap_event_pod_killpg(pod, ap_daemons_limit, FALSE);
ap_reclaim_child_processes(1); /* Start with SIGTERM */
if (!child_fatal) {
@@ -2180,7 +2197,7 @@
/* Close our listeners, and then ask our children to do same */
ap_close_listeners();
- ap_mpm_pod_killpg(pod, ap_daemons_limit, TRUE);
+ ap_event_pod_killpg(pod, ap_daemons_limit, TRUE);
ap_relieve_child_processes();
if (!child_fatal) {
@@ -2227,7 +2244,7 @@
* way, try and make sure that all of our processes are
* really dead.
*/
- ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE);
+ ap_event_pod_killpg(pod, ap_daemons_limit, FALSE);
ap_reclaim_child_processes(1);
return 1;
@@ -2245,15 +2262,15 @@
/* XXX: we really need to make sure this new generation number isn't in
* use by any of the children.
*/
- ++ap_my_generation;
- ap_scoreboard_image->global->running_generation = ap_my_generation;
+ ++my_generation;
+ ap_scoreboard_image->global->running_generation = my_generation;
if (is_graceful) {
ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf,
AP_SIG_GRACEFUL_STRING
" received. Doing graceful restart");
/* wake up the children...time to die. But we'll have more soon */
- ap_mpm_pod_killpg(pod, ap_daemons_limit, TRUE);
+ ap_event_pod_killpg(pod, ap_daemons_limit, TRUE);
/* This is mostly for debugging... so that we know what is still
@@ -2266,7 +2283,7 @@
* and a SIGHUP, we may as well use the same signal, because some user
* pthreads are stealing signals from us left and right.
*/
- ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE);
+ ap_event_pod_killpg(pod, ap_daemons_limit, FALSE);
ap_reclaim_child_processes(1); /* Start with SIGTERM */
ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf,
@@ -2288,7 +2305,6 @@
apr_status_t rv;
pconf = p;
- ap_server_conf = s;
/* the reverse of pre_config, we want this only the first time around */
if (restart_num++ == 0) {
@@ -2304,7 +2320,7 @@
}
if (!one_process) {
- if ((rv = ap_mpm_pod_open(pconf, &pod))) {
+ if ((rv = ap_event_pod_open(pconf, &pod))) {
ap_log_error(APLOG_MARK, APLOG_CRIT | level_flags, rv,
(startup ? NULL : s),
"could not open pipe-of-death");
@@ -2367,8 +2383,8 @@
server_limit = DEFAULT_SERVER_LIMIT;
thread_limit = DEFAULT_THREAD_LIMIT;
ap_daemons_limit = server_limit;
- ap_threads_per_child = DEFAULT_THREADS_PER_CHILD;
- max_clients = ap_daemons_limit * ap_threads_per_child;
+ threads_per_child = DEFAULT_THREADS_PER_CHILD;
+ max_clients = ap_daemons_limit * threads_per_child;
ap_pid_fname = DEFAULT_PIDLOG;
ap_lock_fname = DEFAULT_LOCKFILE;
ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD;
@@ -2481,11 +2497,11 @@
thread_limit = first_thread_limit;
}
- if (ap_threads_per_child > thread_limit) {
+ if (threads_per_child > thread_limit) {
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
"WARNING: ThreadsPerChild of %d exceeds ThreadLimit "
- "of", ap_threads_per_child);
+ "of", threads_per_child);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" %d threads, decreasing to %d.",
thread_limit, thread_limit);
@@ -2496,24 +2512,24 @@
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
"ThreadsPerChild of %d exceeds ThreadLimit "
"of %d, decreasing to match",
- ap_threads_per_child, thread_limit);
+ threads_per_child, thread_limit);
}
- ap_threads_per_child = thread_limit;
+ threads_per_child = thread_limit;
}
- else if (ap_threads_per_child < 1) {
+ else if (threads_per_child < 1) {
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
"WARNING: ThreadsPerChild of %d not allowed, "
- "increasing to 1.", ap_threads_per_child);
+ "increasing to 1.", threads_per_child);
} else {
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
"ThreadsPerChild of %d not allowed, increasing to 1",
- ap_threads_per_child);
+ threads_per_child);
}
- ap_threads_per_child = 1;
+ threads_per_child = 1;
}
- if (max_clients < ap_threads_per_child) {
+ if (max_clients < threads_per_child) {
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
"WARNING: MaxClients of %d is less than "
@@ -2521,22 +2537,22 @@
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" %d, increasing to %d. MaxClients must be at "
"least as large",
- ap_threads_per_child, ap_threads_per_child);
+ threads_per_child, threads_per_child);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" as the number of threads in a single server.");
} else {
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
"MaxClients of %d is less than ThreadsPerChild "
"of %d, increasing to match",
- max_clients, ap_threads_per_child);
+ max_clients, threads_per_child);
}
- max_clients = ap_threads_per_child;
+ max_clients = threads_per_child;
}
- ap_daemons_limit = max_clients / ap_threads_per_child;
+ ap_daemons_limit = max_clients / threads_per_child;
- if (max_clients % ap_threads_per_child) {
- int tmp_max_clients = ap_daemons_limit * ap_threads_per_child;
+ if (max_clients % threads_per_child) {
+ int tmp_max_clients = ap_daemons_limit * threads_per_child;
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
@@ -2544,7 +2560,7 @@
"multiple of", max_clients);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" ThreadsPerChild of %d, decreasing to nearest "
- "multiple %d,", ap_threads_per_child,
+ "multiple %d,", threads_per_child,
tmp_max_clients);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" for a maximum of %d servers.",
@@ -2553,7 +2569,7 @@
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
"MaxClients of %d is not an integer multiple of "
"ThreadsPerChild of %d, decreasing to nearest "
- "multiple %d", max_clients, ap_threads_per_child,
+ "multiple %d", max_clients, threads_per_child,
tmp_max_clients);
}
max_clients = tmp_max_clients;
@@ -2566,7 +2582,7 @@
"servers and ", max_clients, ap_daemons_limit);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" would exceed ServerLimit of %d, decreasing to %d.",
- server_limit, server_limit * ap_threads_per_child);
+ server_limit, server_limit * threads_per_child);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" To increase, please see the ServerLimit "
"directive.");
@@ -2575,7 +2591,7 @@
"MaxClients of %d would require %d servers and "
"exceed ServerLimit of %d, decreasing to %d",
max_clients, ap_daemons_limit, server_limit,
- server_limit * ap_threads_per_child);
+ server_limit * threads_per_child);
}
ap_daemons_limit = server_limit;
}
@@ -2611,7 +2627,7 @@
min_spare_threads = 1;
}
- /* max_spare_threads < min_spare_threads + ap_threads_per_child
+ /* max_spare_threads < min_spare_threads + threads_per_child
* checked in ap_mpm_run()
*/
@@ -2633,6 +2649,12 @@
*/
ap_hook_pre_config(event_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST);
ap_hook_check_config(event_check_config, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm(event_run, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_query(event_query, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_get_child_pid(event_get_child_pid, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_note_child_killed(event_note_child_killed, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_register_timed_callback(event_register_timed_callback, NULL, NULL,
+ APR_HOOK_MIDDLE);
}
static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy,
@@ -2691,7 +2713,7 @@
return err;
}
- ap_threads_per_child = atoi(arg);
+ threads_per_child = atoi(arg);
return NULL;
}
static const char *set_server_limit (cmd_parms *cmd, void *dummy, const char *arg)
Modified: httpd/httpd/trunk/server/mpm/experimental/event/pod.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/experimental/event/pod.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/experimental/event/pod.c (original)
+++ httpd/httpd/trunk/server/mpm/experimental/event/pod.c Tue Mar 24 15:43:59 2009
@@ -16,11 +16,13 @@
#include "pod.h"
+#include "apr_portable.h"
+
#if APR_HAVE_UNISTD_H
#include <unistd.h>
#endif
-AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t * p, ap_pod_t ** pod)
+AP_DECLARE(apr_status_t) ap_event_pod_open(apr_pool_t * p, ap_event_pod_t ** pod)
{
apr_status_t rv;
@@ -41,7 +43,7 @@
return APR_SUCCESS;
}
-AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t * pod)
+AP_DECLARE(int) ap_event_pod_check(ap_event_pod_t * pod)
{
char c;
apr_os_file_t fd;
@@ -63,7 +65,7 @@
return AP_NORESTART;
}
-AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t * pod)
+AP_DECLARE(apr_status_t) ap_event_pod_close(ap_event_pod_t * pod)
{
apr_status_t rv;
@@ -79,7 +81,7 @@
return rv;
}
-static apr_status_t pod_signal_internal(ap_pod_t * pod, int graceful)
+static apr_status_t pod_signal_internal(ap_event_pod_t * pod, int graceful)
{
apr_status_t rv;
char char_of_death = graceful ? GRACEFUL_CHAR : RESTART_CHAR;
@@ -93,12 +95,12 @@
return rv;
}
-AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t * pod, int graceful)
+AP_DECLARE(apr_status_t) ap_event_pod_signal(ap_event_pod_t * pod, int graceful)
{
return pod_signal_internal(pod, graceful);
}
-AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t * pod, int num, int graceful)
+AP_DECLARE(void) ap_event_pod_killpg(ap_event_pod_t * pod, int num, int graceful)
{
int i;
apr_status_t rv = APR_SUCCESS;
Modified: httpd/httpd/trunk/server/mpm/experimental/event/pod.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/experimental/event/pod.h?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/experimental/event/pod.h (original)
+++ httpd/httpd/trunk/server/mpm/experimental/event/pod.h Tue Mar 24 15:43:59 2009
@@ -31,7 +31,6 @@
#include "http_config.h"
#include "http_log.h"
#include "http_main.h"
-#include "mpm.h"
#include "mpm_common.h"
#include "ap_mpm.h"
#include "ap_listen.h"
@@ -43,18 +42,18 @@
#define AP_RESTART 0
#define AP_GRACEFUL 1
-typedef struct ap_pod_t ap_pod_t;
+typedef struct ap_event_pod_t ap_event_pod_t;
-struct ap_pod_t
+struct ap_event_pod_t
{
apr_file_t *pod_in;
apr_file_t *pod_out;
apr_pool_t *p;
};
-AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t * p, ap_pod_t ** pod);
-AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t * pod);
-AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t * pod);
-AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t * pod, int graceful);
-AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t * pod, int num, int graceful);
+AP_DECLARE(apr_status_t) ap_event_pod_open(apr_pool_t * p, ap_event_pod_t ** pod);
+AP_DECLARE(int) ap_event_pod_check(ap_event_pod_t * pod);
+AP_DECLARE(apr_status_t) ap_event_pod_close(ap_event_pod_t * pod);
+AP_DECLARE(apr_status_t) ap_event_pod_signal(ap_event_pod_t * pod, int graceful);
+AP_DECLARE(void) ap_event_pod_killpg(ap_event_pod_t * pod, int num, int graceful);
/** @} */
Modified: httpd/httpd/trunk/server/mpm/prefork/prefork.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/prefork/prefork.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/prefork/prefork.c (original)
+++ httpd/httpd/trunk/server/mpm/prefork/prefork.c Tue Mar 24 15:43:59 2009
@@ -88,7 +88,6 @@
/* config globals */
-int ap_threads_per_child=0; /* Worker threads per child */
static apr_proc_mutex_t *accept_mutex;
static int ap_daemons_to_start=0;
static int ap_daemons_min_free=0;
@@ -99,13 +98,14 @@
static int mpm_state = AP_MPMQ_STARTING;
static ap_pod_t *pod;
+#define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid)
+
/*
* The max child slot ever assigned, preserved across restarts. Necessary
* to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We
* use this value to optimize routines that have to scan the entire scoreboard.
*/
-int ap_max_daemons_limit = -1;
-server_rec *ap_server_conf;
+static int max_daemons_limit = -1;
/* one_process --- debugging mode variable; can be set from the command line
* with the -X flag. If set, this gets you the child_main loop running
@@ -128,7 +128,7 @@
#ifndef MULTITHREAD
static int my_child_num;
#endif
-ap_generation_t volatile ap_my_generation=0;
+static ap_generation_t volatile my_generation=0;
#ifdef TPF
int tpf_child = 0;
@@ -203,7 +203,7 @@
if (rv != APR_SUCCESS) {
const char *msg = "couldn't grab the accept mutex";
- if (ap_my_generation !=
+ if (my_generation !=
ap_scoreboard_image->global->running_generation) {
ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, NULL, "%s", msg);
clean_child_exit(0);
@@ -221,7 +221,7 @@
if (rv != APR_SUCCESS) {
const char *msg = "couldn't release the accept mutex";
- if (ap_my_generation !=
+ if (my_generation !=
ap_scoreboard_image->global->running_generation) {
ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, NULL, "%s", msg);
/* don't exit here... we have a connection to
@@ -247,7 +247,7 @@
#define SAFE_ACCEPT(stmt) do {stmt;} while(0)
#endif
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+static apr_status_t prefork_query(int query_code, int *result)
{
switch(query_code){
case AP_MPMQ_MAX_DAEMON_USED:
@@ -289,10 +289,24 @@
case AP_MPMQ_MPM_STATE:
*result = mpm_state;
return APR_SUCCESS;
+ case AP_MPMQ_GENERATION:
+ *result = my_generation;
+ return APR_SUCCESS;
}
return APR_ENOTIMPL;
}
+static pid_t prefork_get_child_pid(int childnum)
+{
+ return ap_scoreboard_image->parent[childnum].pid;
+}
+
+static apr_status_t prefork_note_child_killed(int childnum)
+{
+ ap_scoreboard_image->parent[childnum].pid = 0;
+ return APR_SUCCESS;
+}
+
/*****************************************************************
* Connection structures and accounting...
*/
@@ -510,6 +524,8 @@
/* ### check the status */
(void) apr_pollset_add(pollset, &pfd);
+
+ lr->accept_func = ap_unixd_accept;
}
mpm_state = AP_MPMQ_RUNNING;
@@ -650,7 +666,7 @@
if (ap_mpm_pod_check(pod) == APR_SUCCESS) { /* selected as idle? */
die_now = 1;
}
- else if (ap_my_generation !=
+ else if (my_generation !=
ap_scoreboard_image->global->running_generation) { /* restart? */
/* yeah, this could be non-graceful restart, in which case the
* parent will kill us soon enough, but why bother checking?
@@ -666,8 +682,8 @@
{
int pid;
- if (slot + 1 > ap_max_daemons_limit) {
- ap_max_daemons_limit = slot + 1;
+ if (slot + 1 > max_daemons_limit) {
+ max_daemons_limit = slot + 1;
}
if (one_process) {
@@ -794,7 +810,7 @@
for (i = 0; i < ap_daemons_limit; ++i) {
int status;
- if (i >= ap_max_daemons_limit && free_length == idle_spawn_rate)
+ if (i >= max_daemons_limit && free_length == idle_spawn_rate)
break;
ws = &ap_scoreboard_image->servers[i][0];
status = ws->status;
@@ -827,7 +843,7 @@
last_non_dead = i;
}
}
- ap_max_daemons_limit = last_non_dead + 1;
+ max_daemons_limit = last_non_dead + 1;
if (idle_count > ap_daemons_max_free) {
/* kill off one child... we use the pod because that'll cause it to
* shut down gracefully, in case it happened to pick up a request
@@ -892,7 +908,7 @@
* Executive routines.
*/
-int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
+static int prefork_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
{
int index;
int remaining_children_to_start;
@@ -939,7 +955,7 @@
/* fix the generation number in the global score; we just got a new,
* cleared scoreboard
*/
- ap_scoreboard_image->global->running_generation = ap_my_generation;
+ ap_scoreboard_image->global->running_generation = my_generation;
}
set_signals();
@@ -1113,7 +1129,7 @@
ap_close_listeners();
/* kill off the idle ones */
- ap_mpm_pod_killpg(pod, ap_max_daemons_limit);
+ ap_mpm_pod_killpg(pod, max_daemons_limit);
/* Send SIGUSR1 to the active children */
active_children = 0;
@@ -1188,15 +1204,15 @@
/* XXX: we really need to make sure this new generation number isn't in
* use by any of the children.
*/
- ++ap_my_generation;
- ap_scoreboard_image->global->running_generation = ap_my_generation;
+ ++my_generation;
+ ap_scoreboard_image->global->running_generation = my_generation;
if (is_graceful) {
ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf,
"Graceful restart requested, doing restart");
/* kill off the idle ones */
- ap_mpm_pod_killpg(pod, ap_max_daemons_limit);
+ ap_mpm_pod_killpg(pod, max_daemons_limit);
/* This is mostly for debugging... so that we know what is still
* gracefully dealing with existing request. This will break
@@ -1409,7 +1425,7 @@
ap_daemons_limit = 1;
}
- /* ap_daemons_to_start > ap_daemons_limit checked in ap_mpm_run() */
+ /* ap_daemons_to_start > ap_daemons_limit checked in prefork_run() */
if (ap_daemons_to_start < 0) {
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
@@ -1440,7 +1456,7 @@
ap_daemons_min_free = 1;
}
- /* ap_daemons_max_free < ap_daemons_min_free + 1 checked in ap_mpm_run() */
+ /* ap_daemons_max_free < ap_daemons_min_free + 1 checked in prefork_run() */
return OK;
}
@@ -1463,6 +1479,10 @@
*/
ap_hook_pre_config(prefork_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST);
ap_hook_check_config(prefork_check_config, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm(prefork_run, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_query(prefork_query, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_get_child_pid(prefork_get_child_pid, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_note_child_killed(prefork_note_child_killed, NULL, NULL, APR_HOOK_MIDDLE);
}
static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy, const char *arg)
Modified: httpd/httpd/trunk/server/mpm/simple/simple_api.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/simple/simple_api.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/simple/simple_api.c (original)
+++ httpd/httpd/trunk/server/mpm/simple/simple_api.c Tue Mar 24 15:43:59 2009
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-#include "mpm.h"
#include "ap_mpm.h"
#include "httpd.h"
#include "http_config.h"
@@ -26,13 +25,9 @@
#include "simple_run.h"
#include "http_core.h"
-/* Thie file contains the absolute minimal MPM API, to interface with httpd. */
+/* This file contains the absolute minimal MPM API, to interface with httpd. */
-ap_generation_t volatile ap_my_generation = 0;
-server_rec *ap_server_conf = NULL;
-
-
- int ap_mpm_run(apr_pool_t * pconf, apr_pool_t * plog, server_rec * s)
+static int simple_run(apr_pool_t * pconf, apr_pool_t * plog, server_rec * s)
{
simple_core_t *sc = simple_core_get();
@@ -46,7 +41,7 @@
return simple_main_loop(sc);
}
-apr_status_t ap_mpm_query(int query_code, int *result)
+static apr_status_t simple_query(int query_code, int *result)
{
simple_core_t *sc = simple_core_get();
@@ -103,6 +98,9 @@
case AP_MPMQ_MPM_STATE:
*result = sc->mpm_state;
return APR_SUCCESS;
+ case AP_MPMQ_GENERATION:
+ *result = 0;
+ return APR_SUCCESS;
default:
break;
}
@@ -116,8 +114,6 @@
{
int nsock;
- ap_server_conf = s;
-
nsock = ap_setup_listeners(s);
if (nsock < 1) {
@@ -232,6 +228,9 @@
ap_hook_check_config(simple_check_config, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm(simple_run, NULL, NULL, APR_HOOK_MIDDLE);
+
+ ap_hook_mpm_query(simple_query, NULL, NULL, APR_HOOK_MIDDLE);
}
static const char *set_proccount(cmd_parms * cmd, void *baton,
Modified: httpd/httpd/trunk/server/mpm/winnt/mpm.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/winnt/mpm.h?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/winnt/mpm.h (original)
+++ httpd/httpd/trunk/server/mpm/winnt/mpm.h Tue Mar 24 15:43:59 2009
@@ -34,15 +34,20 @@
#define MPM_NAME "WinNT"
-#define AP_MPM_WANT_SET_PIDFILE
-#define AP_MPM_WANT_SET_MAX_REQUESTS
-#define AP_MPM_WANT_SET_SCOREBOARD
-#define AP_MPM_WANT_SET_MAX_MEM_FREE
-#define AP_MPM_WANT_SET_STACKSIZE
+#define AP_MPM_NO_SET_ACCEPT_LOCK_MECH
+#define AP_MPM_NO_RECLAIM_CHILD_PROCESSES
+#define AP_MPM_NO_WAIT_OR_TIMEOUT
+#define AP_MPM_NO_PROCESS_CHILD_STATUS
+#define AP_MPM_NO_POD
+#define AP_MPM_NO_SET_LOCKFILE
+#define AP_MPM_NO_SET_COREDUMPDIR
+#define AP_MPM_NO_SET_SCOREBOARD
+#define AP_MPM_NO_SET_GRACEFUL_SHUTDOWN
+#define AP_MPM_NO_SIGNAL_SERVER
+#define AP_MPM_NO_FATAL_SIGNAL_HANDLER
extern int ap_threads_per_child;
extern int ap_thread_limit;
-extern server_rec *ap_server_conf;
#endif /* APACHE_MPM_H */
/** @} */
Modified: httpd/httpd/trunk/server/mpm/winnt/mpm_winnt.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/winnt/mpm_winnt.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/winnt/mpm_winnt.c (original)
+++ httpd/httpd/trunk/server/mpm/winnt/mpm_winnt.c Tue Mar 24 15:43:59 2009
@@ -44,8 +44,8 @@
*/
extern apr_shm_t *ap_scoreboard_shm;
-/* ap_my_generation are used by the scoreboard code */
-ap_generation_t volatile ap_my_generation=0;
+/* my_generation is returned to the scoreboard code */
+static ap_generation_t volatile my_generation=0;
/* Definitions of WINNT MPM specific config globals */
static HANDLE shutdown_event; /* used to signal the parent to shutdown */
@@ -78,11 +78,6 @@
*/
apr_pool_t *pconf;
-/* on several occasions we don't have the global server context
- * although it's needed for logging, etc.
- */
-server_rec *ap_server_conf;
-
/* definitions from child.c */
void child_main(apr_pool_t *pconf);
@@ -843,8 +838,8 @@
event_handles[CHILD_HANDLE] = NULL;
}
if (restart_pending) {
- ++ap_my_generation;
- ap_scoreboard_image->global->running_generation = ap_my_generation;
+ ++my_generation;
+ ap_scoreboard_image->global->running_generation = my_generation;
}
die_now:
if (shutdown_pending)
@@ -898,7 +893,7 @@
* service after we preflight the config.
*/
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+static apr_status_t winnt_query(int query_code, int *result)
{
switch(query_code){
case AP_MPMQ_MAX_DAEMON_USED:
@@ -940,6 +935,9 @@
case AP_MPMQ_MPM_STATE:
*result = winnt_mpm_state;
return APR_SUCCESS;
+ case AP_MPMQ_GENERATION:
+ *result = my_generation;
+ return APR_SUCCESS;
}
return APR_ENOTIMPL;
}
@@ -1334,7 +1332,7 @@
service_name);
exit(APEXIT_INIT);
}
- else if (!one_process && !ap_my_generation) {
+ else if (!one_process && !my_generation) {
/* Open a null handle to soak stdout in this process.
* We need to emulate apr_proc_detach, unix performs this
* same check in the pre_config hook (although it is
@@ -1635,7 +1633,7 @@
/* Done reading from the parent, close that channel */
CloseHandle(pipe);
- ap_my_generation = ap_scoreboard_image->global->running_generation;
+ my_generation = ap_scoreboard_image->global->running_generation;
}
else {
/* Single process mode - this lock doesn't even need to exist */
@@ -1654,7 +1652,7 @@
}
-AP_DECLARE(int) ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s )
+static int winnt_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s )
{
static int restart = 0; /* Default is "not a restart" */
@@ -1729,6 +1727,8 @@
ap_hook_post_config(winnt_post_config, NULL, NULL, 0);
ap_hook_child_init(winnt_child_init, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_open_logs(winnt_open_logs, NULL, aszSucc, APR_HOOK_REALLY_FIRST);
+ ap_hook_mpm(winnt_run, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_query(winnt_query, NULL, NULL, APR_HOOK_MIDDLE);
}
AP_MODULE_DECLARE_DATA module mpm_winnt_module = {
Modified: httpd/httpd/trunk/server/mpm/worker/pod.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/pod.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/worker/pod.c (original)
+++ httpd/httpd/trunk/server/mpm/worker/pod.c Tue Mar 24 15:43:59 2009
@@ -14,13 +14,14 @@
* limitations under the License.
*/
+#include "apr_portable.h"
#include "pod.h"
#if APR_HAVE_UNISTD_H
#include <unistd.h>
#endif
-AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod)
+AP_DECLARE(apr_status_t) ap_worker_pod_open(apr_pool_t *p, ap_worker_pod_t **pod)
{
apr_status_t rv;
@@ -41,7 +42,7 @@
return APR_SUCCESS;
}
-AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t *pod)
+AP_DECLARE(int) ap_worker_pod_check(ap_worker_pod_t *pod)
{
char c;
apr_os_file_t fd;
@@ -63,7 +64,7 @@
return AP_NORESTART;
}
-AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod)
+AP_DECLARE(apr_status_t) ap_worker_pod_close(ap_worker_pod_t *pod)
{
apr_status_t rv;
@@ -79,7 +80,7 @@
return rv;
}
-static apr_status_t pod_signal_internal(ap_pod_t *pod, int graceful)
+static apr_status_t pod_signal_internal(ap_worker_pod_t *pod, int graceful)
{
apr_status_t rv;
char char_of_death = graceful ? GRACEFUL_CHAR : RESTART_CHAR;
@@ -93,12 +94,12 @@
return rv;
}
-AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod, int graceful)
+AP_DECLARE(apr_status_t) ap_worker_pod_signal(ap_worker_pod_t *pod, int graceful)
{
return pod_signal_internal(pod, graceful);
}
-AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t *pod, int num, int graceful)
+AP_DECLARE(void) ap_worker_pod_killpg(ap_worker_pod_t *pod, int num, int graceful)
{
int i;
apr_status_t rv = APR_SUCCESS;
Modified: httpd/httpd/trunk/server/mpm/worker/pod.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/pod.h?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/worker/pod.h (original)
+++ httpd/httpd/trunk/server/mpm/worker/pod.h Tue Mar 24 15:43:59 2009
@@ -31,7 +31,6 @@
#include "http_config.h"
#include "http_log.h"
#include "http_main.h"
-#include "mpm.h"
#include "mpm_common.h"
#include "ap_mpm.h"
#include "ap_listen.h"
@@ -43,17 +42,17 @@
#define AP_RESTART 0
#define AP_GRACEFUL 1
-typedef struct ap_pod_t ap_pod_t;
+typedef struct ap_worker_pod_t ap_worker_pod_t;
-struct ap_pod_t {
+struct ap_worker_pod_t {
apr_file_t *pod_in;
apr_file_t *pod_out;
apr_pool_t *p;
};
-AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod);
-AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t *pod);
-AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod);
-AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod, int graceful);
-AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t *pod, int num, int graceful);
+AP_DECLARE(apr_status_t) ap_worker_pod_open(apr_pool_t *p, ap_worker_pod_t **pod);
+AP_DECLARE(int) ap_worker_pod_check(ap_worker_pod_t *pod);
+AP_DECLARE(apr_status_t) ap_worker_pod_close(ap_worker_pod_t *pod);
+AP_DECLARE(apr_status_t) ap_worker_pod_signal(ap_worker_pod_t *pod, int graceful);
+AP_DECLARE(void) ap_worker_pod_killpg(ap_worker_pod_t *pod, int num, int graceful);
/** @} */
Modified: httpd/httpd/trunk/server/mpm/worker/worker.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/worker.c?rev=757853&r1=757852&r2=757853&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/worker/worker.c (original)
+++ httpd/httpd/trunk/server/mpm/worker/worker.c Tue Mar 24 15:43:59 2009
@@ -64,6 +64,7 @@
#include "scoreboard.h"
#include "fdqueue.h"
#include "mpm_default.h"
+#include "unixd.h"
#include <signal.h>
#include <limits.h> /* for INT_MAX */
@@ -112,7 +113,7 @@
* Actual definitions of config globals
*/
-int ap_threads_per_child = 0; /* Worker threads per child */
+static int threads_per_child = 0; /* Worker threads per child */
static int ap_daemons_to_start = 0;
static int min_spare_threads = 0;
static int max_spare_threads = 0;
@@ -133,6 +134,9 @@
static fd_queue_info_t *worker_queue_info;
static int mpm_state = AP_MPMQ_STARTING;
static int sick_child_detected;
+static ap_generation_t volatile my_generation = 0;
+
+#define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid)
/* The structure used to pass unique initialization info to each thread */
typedef struct {
@@ -159,13 +163,9 @@
* use this value to optimize routines that have to scan the entire
* scoreboard.
*/
-int ap_max_daemons_limit = -1;
-
-static ap_pod_t *pod;
-
-/* *Non*-shared http_main globals... */
+static int max_daemons_limit = -1;
-server_rec *ap_server_conf;
+static ap_worker_pod_t *pod;
/* The worker MPM respects a couple of runtime flags that can aid
* in debugging. Setting the -DNO_DETACH flag will prevent the root process
@@ -231,7 +231,7 @@
static void close_worker_sockets(void)
{
int i;
- for (i = 0; i < ap_threads_per_child; i++) {
+ for (i = 0; i < threads_per_child; i++) {
if (worker_sockets[i]) {
apr_socket_close(worker_sockets[i]);
worker_sockets[i] = NULL;
@@ -296,11 +296,11 @@
}
}
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+static apr_status_t worker_query(int query_code, int *result)
{
switch(query_code){
case AP_MPMQ_MAX_DAEMON_USED:
- *result = ap_max_daemons_limit;
+ *result = max_daemons_limit;
return APR_SUCCESS;
case AP_MPMQ_IS_THREADED:
*result = AP_MPMQ_STATIC;
@@ -315,7 +315,7 @@
*result = thread_limit;
return APR_SUCCESS;
case AP_MPMQ_MAX_THREADS:
- *result = ap_threads_per_child;
+ *result = threads_per_child;
return APR_SUCCESS;
case AP_MPMQ_MIN_SPARE_DAEMONS:
*result = 0;
@@ -338,10 +338,24 @@
case AP_MPMQ_MPM_STATE:
*result = mpm_state;
return APR_SUCCESS;
+ case AP_MPMQ_GENERATION:
+ *result = my_generation;
+ return APR_SUCCESS;
}
return APR_ENOTIMPL;
}
+static pid_t worker_get_child_pid(int childnum)
+{
+ return ap_scoreboard_image->parent[childnum].pid;
+}
+
+static apr_status_t worker_note_child_killed(int childnum)
+{
+ ap_scoreboard_image->parent[childnum].pid = 0;
+ return APR_SUCCESS;
+}
+
/* 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)
@@ -367,7 +381,6 @@
static int volatile restart_pending;
static int volatile is_graceful;
static volatile int child_fatal;
-ap_generation_t volatile ap_my_generation = 0;
/*
* ap_start_shutdown() and ap_start_restart(), below, are a first stab at
@@ -608,6 +621,8 @@
/* ### check the status */
(void) apr_pollset_add(pollset, &pfd);
+
+ lr->accept_func = ap_unixd_accept;
}
/* Unblock the signal used to wake this thread up, and set a handler for
@@ -822,7 +837,7 @@
ap_scoreboard_image->servers[process_slot][thread_slot].pid = ap_my_pid;
ap_scoreboard_image->servers[process_slot][thread_slot].tid = apr_os_thread_current();
- ap_scoreboard_image->servers[process_slot][thread_slot].generation = ap_my_generation;
+ ap_scoreboard_image->servers[process_slot][thread_slot].generation = my_generation;
ap_update_child_status_from_indexes(process_slot, thread_slot, SERVER_STARTING, NULL);
#ifdef HAVE_PTHREAD_KILL
@@ -951,7 +966,7 @@
/* We must create the fd queues before we start up the listener
* and worker threads. */
worker_queue = apr_pcalloc(pchild, sizeof(*worker_queue));
- rv = ap_queue_init(worker_queue, ap_threads_per_child, pchild);
+ rv = ap_queue_init(worker_queue, threads_per_child, pchild);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf,
"ap_queue_init() failed");
@@ -959,20 +974,20 @@
}
rv = ap_queue_info_create(&worker_queue_info, pchild,
- ap_threads_per_child);
+ threads_per_child);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf,
"ap_queue_info_create() failed");
clean_child_exit(APEXIT_CHILDFATAL);
}
- worker_sockets = apr_pcalloc(pchild, ap_threads_per_child
+ worker_sockets = apr_pcalloc(pchild, threads_per_child
* sizeof(apr_socket_t *));
loops = prev_threads_created = 0;
while (1) {
- /* ap_threads_per_child does not include the listener thread */
- for (i = 0; i < ap_threads_per_child; i++) {
+ /* threads_per_child does not include the listener thread */
+ for (i = 0; i < threads_per_child; i++) {
int status = ap_scoreboard_image->servers[child_num_arg][i].status;
if (status != SERVER_GRACEFUL && status != SERVER_DEAD) {
@@ -1010,7 +1025,7 @@
create_listener_thread(ts);
listener_started = 1;
}
- if (start_thread_may_exit || threads_created == ap_threads_per_child) {
+ if (start_thread_may_exit || threads_created == threads_per_child) {
break;
}
/* wait for previous generation to clean up an entry */
@@ -1021,7 +1036,7 @@
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf,
"child %" APR_PID_T_FMT " isn't taking over "
"slots very quickly (%d of %d)",
- ap_my_pid, threads_created, ap_threads_per_child);
+ ap_my_pid, threads_created, threads_per_child);
}
prev_threads_created = threads_created;
}
@@ -1083,7 +1098,7 @@
}
}
- for (i = 0; i < ap_threads_per_child; i++) {
+ for (i = 0; i < threads_per_child; i++) {
if (threads[i]) { /* if we ever created this thread */
#ifdef HAVE_PTHREAD_KILL
apr_os_thread_t *worker_os_thread;
@@ -1178,7 +1193,7 @@
* and we want a 0 entry to indicate a thread which was not created
*/
threads = (apr_thread_t **)calloc(1,
- sizeof(apr_thread_t *) * ap_threads_per_child);
+ sizeof(apr_thread_t *) * threads_per_child);
if (threads == NULL) {
ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf,
"malloc: out of memory");
@@ -1246,7 +1261,7 @@
apr_signal(SIGTERM, dummy_signal_handler);
/* Watch for any messages from the parent over the POD */
while (1) {
- rv = ap_mpm_pod_check(pod);
+ rv = ap_worker_pod_check(pod);
if (rv == AP_NORESTART) {
/* see if termination was triggered while we slept */
switch(terminate_mode) {
@@ -1287,8 +1302,8 @@
{
int pid;
- if (slot + 1 > ap_max_daemons_limit) {
- ap_max_daemons_limit = slot + 1;
+ if (slot + 1 > max_daemons_limit) {
+ max_daemons_limit = slot + 1;
}
if (one_process) {
@@ -1406,19 +1421,19 @@
for (i = 0; i < ap_daemons_limit; ++i) {
/* Initialization to satisfy the compiler. It doesn't know
- * that ap_threads_per_child is always > 0 */
+ * that threads_per_child is always > 0 */
int status = SERVER_DEAD;
int any_dying_threads = 0;
int any_dead_threads = 0;
int all_dead_threads = 1;
- if (i >= ap_max_daemons_limit && totally_free_length == idle_spawn_rate)
+ if (i >= max_daemons_limit && totally_free_length == idle_spawn_rate)
/* short cut if all active processes have been examined and
* enough empty scoreboard slots have been found
*/
break;
ps = &ap_scoreboard_image->parent[i];
- for (j = 0; j < ap_threads_per_child; j++) {
+ for (j = 0; j < threads_per_child; j++) {
ws = &ap_scoreboard_image->servers[i][j];
status = ws->status;
@@ -1440,7 +1455,7 @@
loop if no pid? not much else matters */
if (status <= SERVER_READY &&
!ps->quiescing &&
- ps->generation == ap_my_generation) {
+ ps->generation == my_generation) {
++idle_thread_count;
}
if (status >= SERVER_READY && status < SERVER_GRACEFUL) {
@@ -1498,18 +1513,18 @@
}
}
- ap_max_daemons_limit = last_non_dead + 1;
+ max_daemons_limit = last_non_dead + 1;
if (idle_thread_count > max_spare_threads) {
/* Kill off one child */
- ap_mpm_pod_signal(pod, TRUE);
+ ap_worker_pod_signal(pod, TRUE);
idle_spawn_rate = 1;
}
else if (idle_thread_count < min_spare_threads) {
/* terminate the free list */
if (free_length == 0) { /* scoreboard is full, can't fork */
- if (active_thread_count >= ap_daemons_limit * ap_threads_per_child) {
+ if (active_thread_count >= ap_daemons_limit * threads_per_child) {
static int reported = 0;
if (!reported) {
/* only report this condition once */
@@ -1587,7 +1602,7 @@
/* non-fatal death... note that it's gone in the scoreboard. */
child_slot = ap_find_child_by_pid(&pid);
if (child_slot >= 0) {
- for (i = 0; i < ap_threads_per_child; i++)
+ for (i = 0; i < threads_per_child; i++)
ap_update_child_status_from_indexes(child_slot, i, SERVER_DEAD,
(request_rec *) NULL);
@@ -1649,7 +1664,7 @@
}
}
-int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
+static int worker_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
{
int remaining_children_to_start;
apr_status_t rv;
@@ -1694,13 +1709,13 @@
/* fix the generation number in the global score; we just got a new,
* cleared scoreboard
*/
- ap_scoreboard_image->global->running_generation = ap_my_generation;
+ ap_scoreboard_image->global->running_generation = my_generation;
}
set_signals();
/* Don't thrash... */
- if (max_spare_threads < min_spare_threads + ap_threads_per_child)
- max_spare_threads = min_spare_threads + ap_threads_per_child;
+ if (max_spare_threads < min_spare_threads + threads_per_child)
+ max_spare_threads = min_spare_threads + threads_per_child;
/* If we're doing a graceful_restart then we're going to see a lot
* of children exiting immediately when we get into the main loop
@@ -1746,7 +1761,7 @@
/* Time to shut down:
* Kill child processes, tell them to call child_exit, etc...
*/
- ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE);
+ ap_worker_pod_killpg(pod, ap_daemons_limit, FALSE);
ap_reclaim_child_processes(1); /* Start with SIGTERM */
if (!child_fatal) {
@@ -1773,7 +1788,7 @@
/* Close our listeners, and then ask our children to do same */
ap_close_listeners();
- ap_mpm_pod_killpg(pod, ap_daemons_limit, TRUE);
+ ap_worker_pod_killpg(pod, ap_daemons_limit, TRUE);
ap_relieve_child_processes();
if (!child_fatal) {
@@ -1820,7 +1835,7 @@
* way, try and make sure that all of our processes are
* really dead.
*/
- ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE);
+ ap_worker_pod_killpg(pod, ap_daemons_limit, FALSE);
ap_reclaim_child_processes(1);
return 1;
@@ -1838,14 +1853,14 @@
/* XXX: we really need to make sure this new generation number isn't in
* use by any of the children.
*/
- ++ap_my_generation;
- ap_scoreboard_image->global->running_generation = ap_my_generation;
+ ++my_generation;
+ ap_scoreboard_image->global->running_generation = my_generation;
if (is_graceful) {
ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf,
AP_SIG_GRACEFUL_STRING " received. Doing graceful restart");
/* wake up the children...time to die. But we'll have more soon */
- ap_mpm_pod_killpg(pod, ap_daemons_limit, TRUE);
+ ap_worker_pod_killpg(pod, ap_daemons_limit, TRUE);
/* This is mostly for debugging... so that we know what is still
@@ -1858,7 +1873,7 @@
* and a SIGHUP, we may as well use the same signal, because some user
* pthreads are stealing signals from us left and right.
*/
- ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE);
+ ap_worker_pod_killpg(pod, ap_daemons_limit, FALSE);
ap_reclaim_child_processes(1); /* Start with SIGTERM */
ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf,
@@ -1879,7 +1894,6 @@
apr_status_t rv;
pconf = p;
- ap_server_conf = s;
/* the reverse of pre_config, we want this only the first time around */
if (restart_num++ == 0) {
@@ -1895,7 +1909,7 @@
}
if (!one_process) {
- if ((rv = ap_mpm_pod_open(pconf, &pod))) {
+ if ((rv = ap_worker_pod_open(pconf, &pod))) {
ap_log_error(APLOG_MARK, APLOG_CRIT | level_flags, rv,
(startup ? NULL : s),
"could not open pipe-of-death");
@@ -1949,8 +1963,8 @@
server_limit = DEFAULT_SERVER_LIMIT;
thread_limit = DEFAULT_THREAD_LIMIT;
ap_daemons_limit = server_limit;
- ap_threads_per_child = DEFAULT_THREADS_PER_CHILD;
- max_clients = ap_daemons_limit * ap_threads_per_child;
+ threads_per_child = DEFAULT_THREADS_PER_CHILD;
+ max_clients = ap_daemons_limit * threads_per_child;
ap_pid_fname = DEFAULT_PIDLOG;
ap_lock_fname = DEFAULT_LOCKFILE;
ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD;
@@ -2063,11 +2077,11 @@
thread_limit = first_thread_limit;
}
- if (ap_threads_per_child > thread_limit) {
+ if (threads_per_child > thread_limit) {
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
"WARNING: ThreadsPerChild of %d exceeds ThreadLimit "
- "of", ap_threads_per_child);
+ "of", threads_per_child);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" %d threads, decreasing to %d.",
thread_limit, thread_limit);
@@ -2078,24 +2092,24 @@
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
"ThreadsPerChild of %d exceeds ThreadLimit "
"of %d, decreasing to match",
- ap_threads_per_child, thread_limit);
+ threads_per_child, thread_limit);
}
- ap_threads_per_child = thread_limit;
+ threads_per_child = thread_limit;
}
- else if (ap_threads_per_child < 1) {
+ else if (threads_per_child < 1) {
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
"WARNING: ThreadsPerChild of %d not allowed, "
- "increasing to 1.", ap_threads_per_child);
+ "increasing to 1.", threads_per_child);
} else {
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
"ThreadsPerChild of %d not allowed, increasing to 1",
- ap_threads_per_child);
+ threads_per_child);
}
- ap_threads_per_child = 1;
+ threads_per_child = 1;
}
- if (max_clients < ap_threads_per_child) {
+ if (max_clients < threads_per_child) {
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
"WARNING: MaxClients of %d is less than "
@@ -2103,22 +2117,22 @@
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" %d, increasing to %d. MaxClients must be at "
"least as large",
- ap_threads_per_child, ap_threads_per_child);
+ threads_per_child, threads_per_child);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" as the number of threads in a single server.");
} else {
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
"MaxClients of %d is less than ThreadsPerChild "
"of %d, increasing to match",
- max_clients, ap_threads_per_child);
+ max_clients, threads_per_child);
}
- max_clients = ap_threads_per_child;
+ max_clients = threads_per_child;
}
- ap_daemons_limit = max_clients / ap_threads_per_child;
+ ap_daemons_limit = max_clients / threads_per_child;
- if (max_clients % ap_threads_per_child) {
- int tmp_max_clients = ap_daemons_limit * ap_threads_per_child;
+ if (max_clients % threads_per_child) {
+ int tmp_max_clients = ap_daemons_limit * threads_per_child;
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
@@ -2126,7 +2140,7 @@
"multiple of", max_clients);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" ThreadsPerChild of %d, decreasing to nearest "
- "multiple %d,", ap_threads_per_child,
+ "multiple %d,", threads_per_child,
tmp_max_clients);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" for a maximum of %d servers.",
@@ -2135,7 +2149,7 @@
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
"MaxClients of %d is not an integer multiple of "
"ThreadsPerChild of %d, decreasing to nearest "
- "multiple %d", max_clients, ap_threads_per_child,
+ "multiple %d", max_clients, threads_per_child,
tmp_max_clients);
}
max_clients = tmp_max_clients;
@@ -2148,7 +2162,7 @@
"servers and ", max_clients, ap_daemons_limit);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" would exceed ServerLimit of %d, decreasing to %d.",
- server_limit, server_limit * ap_threads_per_child);
+ server_limit, server_limit * threads_per_child);
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
" To increase, please see the ServerLimit "
"directive.");
@@ -2157,12 +2171,12 @@
"MaxClients of %d would require %d servers and "
"exceed ServerLimit of %d, decreasing to %d",
max_clients, ap_daemons_limit, server_limit,
- server_limit * ap_threads_per_child);
+ server_limit * threads_per_child);
}
ap_daemons_limit = server_limit;
}
- /* ap_daemons_to_start > ap_daemons_limit checked in ap_mpm_run() */
+ /* ap_daemons_to_start > ap_daemons_limit checked in worker_run() */
if (ap_daemons_to_start < 0) {
if (startup) {
ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_STARTUP, 0, NULL,
@@ -2193,8 +2207,8 @@
min_spare_threads = 1;
}
- /* max_spare_threads < min_spare_threads + ap_threads_per_child
- * checked in ap_mpm_run()
+ /* max_spare_threads < min_spare_threads + threads_per_child
+ * checked in worker_run()
*/
return OK;
@@ -2215,6 +2229,10 @@
*/
ap_hook_pre_config(worker_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST);
ap_hook_check_config(worker_check_config, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm(worker_run, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_query(worker_query, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_get_child_pid(worker_get_child_pid, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_mpm_note_child_killed(worker_note_child_killed, NULL, NULL, APR_HOOK_MIDDLE);
}
static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy,
@@ -2273,7 +2291,7 @@
return err;
}
- ap_threads_per_child = atoi(arg);
+ threads_per_child = atoi(arg);
return NULL;
}