123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- { Copyright 1999-2005 The Apache Software Foundation or its licensors, as
- * applicable.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- }
- //#include "apr_thread_proc.h"
- {
- * @package Multi-Processing Module library
- }
- {
- The MPM, "multi-processing model" provides an abstraction of the
- interface with the OS for distributing incoming connections to
- threads/process for processing. http_main invokes the MPM, and
- the MPM runs until a shutdown/restart has been indicated.
- The MPM calls out to the apache core via the ap_process_connection
- function when a connection arrives.
- The MPM may or may not be multithreaded. In the event that it is
- multithreaded, at any instant it guarantees a 1:1 mapping of threads
- ap_process_connection invocations.
- Note: In the future it will be possible for ap_process_connection
- to return to the MPM prior to finishing the entire connection; and
- the MPM will proceed with asynchronous handling for the connection;
- in the future the MPM may call ap_process_connection again -- but
- does not guarantee it will occur on the same thread as the first call.
- The MPM further guarantees that no asynchronous behaviour such as
- longjmps and signals will interfere with the user code that is
- invoked through ap_process_connection. The MPM may reserve some
- signals for its use (i.e. SIGUSR1), but guarantees that these signals
- are ignored when executing outside the MPM code itself. (This
- allows broken user code that does not handle EINTR to function
- properly.)
- The suggested server restart and stop behaviour will be "graceful".
- However the MPM may choose to terminate processes when the user
- requests a non-graceful restart/stop. When this occurs, the MPM kills
- all threads with extreme prejudice, and destroys the pchild pool.
- User cleanups registered in the pchild apr_pool_t will be invoked at
- this point. (This can pose some complications, the user cleanups
- are asynchronous behaviour not unlike longjmp/signal... but if the
- admin is asking for a non-graceful shutdown, how much effort should
- we put into doing it in a nice way?)
- unix/posix notes:
- - The MPM does not set a SIGALRM handler, user code may use SIGALRM.
- But the preferred method of handling timeouts is to use the
- timeouts provided by the BUFF abstraction.
- - The proper setting for SIGPIPE is SIG_IGN, if user code changes it
- for any of their own processing, it must be restored to SIG_IGN
- prior to executing or returning to any apache code.
- TODO: add SIGPIPE debugging check somewhere to make sure it's SIG_IGN
- }
- {
- * 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.
- * @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.
- * @return 1 for shutdown 0 otherwise.
- * @deffunc int ap_mpm_run(apr_pool_t *pconf, apr_pool_t *plog, server_rec *server_conf)
- }
- function ap_mpm_run(pconf, plog: Papr_pool_t; server_conf: Pserver_rec): Integer;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- external LibHTTPD name LibNamePrefix + 'ap_mpm_run' + LibSuff12;
- {
- * predicate indicating if a graceful stop has been requested ...
- * used by the connection loop
- * @return 1 if a graceful stop has been requested, 0 otherwise
- * @deffunc int ap_graceful_stop_signalled(*void)
- }
- function ap_graceful_stop_signalled: Integer;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- external LibHTTPD name LibNamePrefix + 'ap_graceful_stop_signalled' + LibSuff0;
- {
- * Spawn a process with privileges that another module has requested
- * @param r The request_rec of the current request
- * @param newproc The resulting process handle.
- * @param progname The program to run
- * @param const_args the arguments to pass to the new program. The first
- * one should be the program name.
- * @param env The new environment apr_table_t for the new process. This
- * should be a list of NULL-terminated strings.
- * @param attr the procattr we should use to determine how to create the new
- * process
- * @param p The pool to use.
- }
- function ap_os_create_privileged_process(
- const r: Prequest_rec;
- newproc: Papr_proc_t;
- const progname, args, env: PChar;
- attr: Papr_procattr_t; p: Papr_pool_t): apr_status_t;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- external LibHTTPD name LibNamePrefix + 'ap_os_create_privileged_process' + LibSuff28;
- const
- { Subtypes/Values for AP_MPMQ_IS_THREADED and AP_MPMQ_IS_FORKED }
- AP_MPMQ_NOT_SUPPORTED = 0; { This value specifies whether }
- { an MPM is capable of }
- { threading or forking. }
- AP_MPMQ_STATIC = 1; { This value specifies whether }
- { an MPM is using a static # }
- { threads or daemons. }
- AP_MPMQ_DYNAMIC = 2; { This value specifies whether }
- { an MPM is using a dynamic # }
- { threads or daemons. }
- { Values returned for AP_MPMQ_MPM_STATE }
- AP_MPMQ_STARTING = 0;
- AP_MPMQ_RUNNING = 1;
- AP_MPMQ_STOPPING = 2;
- AP_MPMQ_MAX_DAEMON_USED = 1; { Max # of daemons used so far }
- AP_MPMQ_IS_THREADED = 2; { MPM can do threading }
- AP_MPMQ_IS_FORKED = 3; { MPM can do forking }
- AP_MPMQ_HARD_LIMIT_DAEMONS = 4; { The compiled max # daemons }
- AP_MPMQ_HARD_LIMIT_THREADS = 5; { The compiled max # threads }
- AP_MPMQ_MAX_THREADS = 6; { # of threads/child by config }
- AP_MPMQ_MIN_SPARE_DAEMONS = 7; { Min # of spare daemons }
- AP_MPMQ_MIN_SPARE_THREADS = 8; { Min # of spare threads }
- AP_MPMQ_MAX_SPARE_DAEMONS = 9; { Max # of spare daemons }
- AP_MPMQ_MAX_SPARE_THREADS = 10; { Max # of spare threads }
- AP_MPMQ_MAX_REQUESTS_DAEMON = 11; { Max # of requests per daemon }
- AP_MPMQ_MAX_DAEMONS = 12; { Max # of daemons by config }
- AP_MPMQ_MPM_STATE = 13; { starting, running, stopping }
- {
- * 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)
- }
- function ap_mpm_query(query_code: Integer; result: PInteger): apr_status_t;
- {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
- external LibHTTPD name LibNamePrefix + 'ap_mpm_query' + LibSuff8;
- { Defining GPROF when compiling uses the moncontrol() function to
- * disable gprof profiling in the parent, and enable it only for
- * request processing in children (or in one_process mode). It's
- * absolutely required to get useful gprof results under linux
- * because the profile itimers and such are disabled across a
- * fork(). It's probably useful elsewhere as well.
- }
- {#ifdef GPROF
- extern void moncontrol(int);
- #define AP_MONCONTROL(x) moncontrol(x)
- #else
- #define AP_MONCONTROL(x)
- #endif}
- {$ifdef AP_ENABLE_EXCEPTION_HOOK}
- type
- ap_exception_info_t = record
- sig: Integer;
- pid: pid_t;
- end;
- AP_DECLARE_HOOK(int,fatal_exception,(ap_exception_info_t *ei))
- {$endif} {AP_ENABLE_EXCEPTION_HOOK}
|