Annotation of win32/apache22/include/ap_mpm.h, revision 1.1
1.1 ! moko 1: /* Licensed to the Apache Software Foundation (ASF) under one or more
! 2: * contributor license agreements. See the NOTICE file distributed with
! 3: * this work for additional information regarding copyright ownership.
! 4: * The ASF licenses this file to You under the Apache License, Version 2.0
! 5: * (the "License"); you may not use this file except in compliance with
! 6: * the License. You may obtain a copy of the License at
! 7: *
! 8: * http://www.apache.org/licenses/LICENSE-2.0
! 9: *
! 10: * Unless required by applicable law or agreed to in writing, software
! 11: * distributed under the License is distributed on an "AS IS" BASIS,
! 12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
! 13: * See the License for the specific language governing permissions and
! 14: * limitations under the License.
! 15: */
! 16:
! 17: /**
! 18: * @file ap_mmn.h
! 19: * @brief Apache Multi-Processing Module library
! 20: *
! 21: * @defgroup APACHE_CORE_MPM Multi-Processing Module library
! 22: * @ingroup APACHE_CORE
! 23: * @{
! 24: */
! 25:
! 26: #ifndef AP_MPM_H
! 27: #define AP_MPM_H
! 28:
! 29: #include "apr_thread_proc.h"
! 30:
! 31: #ifdef __cplusplus
! 32: extern "C" {
! 33: #endif
! 34:
! 35: /*
! 36: The MPM, "multi-processing model" provides an abstraction of the
! 37: interface with the OS for distributing incoming connections to
! 38: threads/process for processing. http_main invokes the MPM, and
! 39: the MPM runs until a shutdown/restart has been indicated.
! 40: The MPM calls out to the apache core via the ap_process_connection
! 41: function when a connection arrives.
! 42:
! 43: The MPM may or may not be multithreaded. In the event that it is
! 44: multithreaded, at any instant it guarantees a 1:1 mapping of threads
! 45: ap_process_connection invocations.
! 46:
! 47: Note: In the future it will be possible for ap_process_connection
! 48: to return to the MPM prior to finishing the entire connection; and
! 49: the MPM will proceed with asynchronous handling for the connection;
! 50: in the future the MPM may call ap_process_connection again -- but
! 51: does not guarantee it will occur on the same thread as the first call.
! 52:
! 53: The MPM further guarantees that no asynchronous behaviour such as
! 54: longjmps and signals will interfere with the user code that is
! 55: invoked through ap_process_connection. The MPM may reserve some
! 56: signals for its use (i.e. SIGUSR1), but guarantees that these signals
! 57: are ignored when executing outside the MPM code itself. (This
! 58: allows broken user code that does not handle EINTR to function
! 59: properly.)
! 60:
! 61: The suggested server restart and stop behaviour will be "graceful".
! 62: However the MPM may choose to terminate processes when the user
! 63: requests a non-graceful restart/stop. When this occurs, the MPM kills
! 64: all threads with extreme prejudice, and destroys the pchild pool.
! 65: User cleanups registered in the pchild apr_pool_t will be invoked at
! 66: this point. (This can pose some complications, the user cleanups
! 67: are asynchronous behaviour not unlike longjmp/signal... but if the
! 68: admin is asking for a non-graceful shutdown, how much effort should
! 69: we put into doing it in a nice way?)
! 70:
! 71: unix/posix notes:
! 72: - The MPM does not set a SIGALRM handler, user code may use SIGALRM.
! 73: But the preferred method of handling timeouts is to use the
! 74: timeouts provided by the BUFF abstraction.
! 75: - The proper setting for SIGPIPE is SIG_IGN, if user code changes it
! 76: for any of their own processing, it must be restored to SIG_IGN
! 77: prior to executing or returning to any apache code.
! 78: TODO: add SIGPIPE debugging check somewhere to make sure it's SIG_IGN
! 79: */
! 80:
! 81: /**
! 82: * This is the function that MPMs must create. This function is responsible
! 83: * for controlling the parent and child processes. It will run until a
! 84: * restart/shutdown is indicated.
! 85: * @param pconf the configuration pool, reset before the config file is read
! 86: * @param plog the log pool, reset after the config file is read
! 87: * @param server_conf the global server config.
! 88: * @return 1 for shutdown 0 otherwise.
! 89: * @deffunc int ap_mpm_run(apr_pool_t *pconf, apr_pool_t *plog, server_rec *server_conf)
! 90: */
! 91: AP_DECLARE(int) ap_mpm_run(apr_pool_t *pconf, apr_pool_t *plog, server_rec *server_conf);
! 92:
! 93: /**
! 94: * predicate indicating if a graceful stop has been requested ...
! 95: * used by the connection loop
! 96: * @return 1 if a graceful stop has been requested, 0 otherwise
! 97: * @deffunc int ap_graceful_stop_signalled(*void)
! 98: */
! 99: AP_DECLARE(int) ap_graceful_stop_signalled(void);
! 100:
! 101: /**
! 102: * Spawn a process with privileges that another module has requested
! 103: * @param r The request_rec of the current request
! 104: * @param newproc The resulting process handle.
! 105: * @param progname The program to run
! 106: * @param const_args the arguments to pass to the new program. The first
! 107: * one should be the program name.
! 108: * @param env The new environment apr_table_t for the new process. This
! 109: * should be a list of NULL-terminated strings.
! 110: * @param attr the procattr we should use to determine how to create the new
! 111: * process
! 112: * @param p The pool to use.
! 113: */
! 114: AP_DECLARE(apr_status_t) ap_os_create_privileged_process(
! 115: const request_rec *r,
! 116: apr_proc_t *newproc,
! 117: const char *progname,
! 118: const char * const *args,
! 119: const char * const *env,
! 120: apr_procattr_t *attr,
! 121: apr_pool_t *p);
! 122:
! 123: /* Subtypes/Values for AP_MPMQ_IS_THREADED and AP_MPMQ_IS_FORKED */
! 124: #define AP_MPMQ_NOT_SUPPORTED 0 /* This value specifies whether */
! 125: /* an MPM is capable of */
! 126: /* threading or forking. */
! 127: #define AP_MPMQ_STATIC 1 /* This value specifies whether */
! 128: /* an MPM is using a static # */
! 129: /* threads or daemons. */
! 130: #define AP_MPMQ_DYNAMIC 2 /* This value specifies whether */
! 131: /* an MPM is using a dynamic # */
! 132: /* threads or daemons. */
! 133:
! 134: /* Values returned for AP_MPMQ_MPM_STATE */
! 135: #define AP_MPMQ_STARTING 0
! 136: #define AP_MPMQ_RUNNING 1
! 137: #define AP_MPMQ_STOPPING 2
! 138:
! 139: #define AP_MPMQ_MAX_DAEMON_USED 1 /* Max # of daemons used so far */
! 140: #define AP_MPMQ_IS_THREADED 2 /* MPM can do threading */
! 141: #define AP_MPMQ_IS_FORKED 3 /* MPM can do forking */
! 142: #define AP_MPMQ_HARD_LIMIT_DAEMONS 4 /* The compiled max # daemons */
! 143: #define AP_MPMQ_HARD_LIMIT_THREADS 5 /* The compiled max # threads */
! 144: #define AP_MPMQ_MAX_THREADS 6 /* # of threads/child by config */
! 145: #define AP_MPMQ_MIN_SPARE_DAEMONS 7 /* Min # of spare daemons */
! 146: #define AP_MPMQ_MIN_SPARE_THREADS 8 /* Min # of spare threads */
! 147: #define AP_MPMQ_MAX_SPARE_DAEMONS 9 /* Max # of spare daemons */
! 148: #define AP_MPMQ_MAX_SPARE_THREADS 10 /* Max # of spare threads */
! 149: #define AP_MPMQ_MAX_REQUESTS_DAEMON 11 /* Max # of requests per daemon */
! 150: #define AP_MPMQ_MAX_DAEMONS 12 /* Max # of daemons by config */
! 151: #define AP_MPMQ_MPM_STATE 13 /* starting, running, stopping */
! 152: #define AP_MPMQ_IS_ASYNC 14 /* MPM can process async connections */
! 153:
! 154: /**
! 155: * Query a property of the current MPM.
! 156: * @param query_code One of APM_MPMQ_*
! 157: * @param result A location to place the result of the query
! 158: * @return APR_SUCCESS or APR_ENOTIMPL
! 159: * @deffunc int ap_mpm_query(int query_code, int *result)
! 160: */
! 161: AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result);
! 162:
! 163: /* Defining GPROF when compiling uses the moncontrol() function to
! 164: * disable gprof profiling in the parent, and enable it only for
! 165: * request processing in children (or in one_process mode). It's
! 166: * absolutely required to get useful gprof results under linux
! 167: * because the profile itimers and such are disabled across a
! 168: * fork(). It's probably useful elsewhere as well.
! 169: */
! 170: #ifdef GPROF
! 171: extern void moncontrol(int);
! 172: #define AP_MONCONTROL(x) moncontrol(x)
! 173: #else
! 174: #define AP_MONCONTROL(x)
! 175: #endif
! 176:
! 177: #if AP_ENABLE_EXCEPTION_HOOK
! 178: typedef struct ap_exception_info_t {
! 179: int sig;
! 180: pid_t pid;
! 181: } ap_exception_info_t;
! 182:
! 183: AP_DECLARE_HOOK(int,fatal_exception,(ap_exception_info_t *ei))
! 184: #endif /*AP_ENABLE_EXCEPTION_HOOK*/
! 185:
! 186: #ifdef __cplusplus
! 187: }
! 188: #endif
! 189:
! 190: #endif
! 191: /** @} */
E-mail: