mpm_common.h revision 346029f34d03eb20d84fc35664426d3874b00f9e
0922cbe8300e97215564748d449824f458196335Lennart Poettering/* ====================================================================
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * The Apache Software License, Version 1.1
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * reserved.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Redistribution and use in source and binary forms, with or without
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * modification, are permitted provided that the following conditions
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * are met:
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * 1. Redistributions of source code must retain the above copyright
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * notice, this list of conditions and the following disclaimer.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * 2. Redistributions in binary form must reproduce the above copyright
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * notice, this list of conditions and the following disclaimer in
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * the documentation and/or other materials provided with the
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * distribution.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * 3. The end-user documentation included with the redistribution,
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * if any, must include the following acknowledgment:
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * "This product includes software developed by the
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Apache Software Foundation (http://www.apache.org/)."
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Alternately, this acknowledgment may appear in the software itself,
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * if and wherever such third-party acknowledgments normally appear.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * 4. The names "Apache" and "Apache Software Foundation" must
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * not be used to endorse or promote products derived from this
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * software without prior written permission. For written
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * permission, please contact apache@apache.org.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * 5. Products derived from this software may not be called "Apache",
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * nor may "Apache" appear in their name, without prior written
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * permission of the Apache Software Foundation.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * SUCH DAMAGE.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * ====================================================================
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * This software consists of voluntary contributions made by many
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * individuals on behalf of the Apache Software Foundation. For more
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * information on the Apache Software Foundation, please see
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * <http://www.apache.org/>.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Portions of this software are based upon public domain software
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * originally written at the National Center for Supercomputing Applications,
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * University of Illinois, Urbana-Champaign.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering/* The purpose of this file is to store the code that MOST mpm's will need
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * this does not mean a function only goes into this file if every MPM needs
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * it. It means that if a function is needed by more than one MPM, and
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * future maintenance would be served by making the code common, then the
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * function belongs here.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * This is going in src/main because it is not platform specific, it is
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * specific to multi-process servers, but NOT to Unix. Which is why it
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * does not belong in src/os/unix
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering#ifndef APACHE_MPM_COMMON_H
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#define APACHE_MPM_COMMON_H
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering#include "ap_config.h"
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering#if APR_HAVE_NETINET_TCP_H
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering#include <netinet/tcp.h> /* for TCP_NODELAY */
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#endif
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering#include "mpm.h" /* for AP_MPM_NEEDS_RECLAIM_CHILD_PROCESSES setting */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering#ifdef __cplusplus
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringextern "C" {
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#endif
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering/**
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @package Multi-Processing Modules functions
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering/* The maximum length of the queue of pending connections, as defined
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * by listen(2). Under some systems, it should be increased if you
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * are experiencing a heavy TCP SYN flood attack.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering *
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * It defaults to 511 instead of 512 because some systems store it
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * as an 8-bit datatype; 512 truncated to 8-bits is 0, while 511 is
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * 255 when truncated.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#ifndef DEFAULT_LISTENBACKLOG
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#define DEFAULT_LISTENBACKLOG 511
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#endif
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering/**
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Make sure all child processes that have been spawned by the parent process
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * have died. This includes process registered as "other_children".
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @warning This is only defined if the MPM defines
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * MPM_NEEDS_RECLAIM_CHILD_PROCESS
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @param terminate Either 1 or 0. If 1, send the child processes SIGTERM
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * each time through the loop. If 0, give the process time to die
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * on its own before signalling it.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @tip This function requires that some macros are defined by the MPM: <pre>
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * MPM_SYNC_CHILD_TABLE -- sync the scoreboard image between child and parent
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * MPM_CHILD_PID -- Get the pid from the specified spot in the scoreboard
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * MPM_NOTE_CHILD_KILLED -- Note the child died in the scoreboard
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * </pre>
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#if AP_MPM_NEEDS_RECLAIM_CHILD_PROCESSES
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poetteringvoid ap_reclaim_child_processes(int terminate);
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#endif
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering/**
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Determine if any child process has died. If no child process died, then
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * this process sleeps for the amount of time specified by the MPM defined
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * macro SCOREBOARD_MAINTENANCE_INTERVAL.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @param status The return code if a process has died
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @param ret The process id of the process that died
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @param p The pool to allocate out of
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poetteringvoid ap_wait_or_timeout(apr_wait_t *status, apr_proc_t *ret, apr_pool_t *p);
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering/**
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * Log why a child died to the error log, if the child died without the
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * parent signalling it.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @param pid The child that has died
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @param status The status returned from ap_wait_or_timeout
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringvoid ap_process_child_status(apr_proc_t *pid, apr_wait_t status);
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering#if defined(TCP_NODELAY) && !defined(MPE) && !defined(TPF)
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering/**
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * Turn off the nagle algorithm for the specified socket. The nagle algorithm
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * says that we should delay sending partial packets in the hopes of getting
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * more data. There are bad interactions between persistent connections and
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Nagle's algorithm that have severe performance penalties.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @param s The socket to disable nagle for.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poetteringvoid ap_sock_disable_nagle(apr_socket_t *s);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering#else
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#define ap_sock_disable_nagle(s) /* NOOP */
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering#endif
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering/**
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * Convert a username to a numeric ID
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @param name The name to convert
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @return The user id corresponding to a name
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @deffunc uid_t ap_uname2id(const char *name)
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart PoetteringAP_DECLARE(uid_t) ap_uname2id(const char *name);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering/**
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Convert a group name to a numeric ID
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @param name The name to convert
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @return The group id corresponding to a name
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @deffunc gid_t ap_gname2id(const char *name)
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart PoetteringAP_DECLARE(gid_t) ap_gname2id(const char *name);
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#define AP_MPM_HARD_LIMITS_FILE APACHE_MPM_DIR "/mpm_default.h"
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#ifdef AP_MPM_USES_POD
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poetteringtypedef struct ap_pod_t ap_pod_t;
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poetteringstruct ap_pod_t {
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering apr_file_t *pod_in;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering apr_file_t *pod_out;
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering apr_pool_t *p;
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering apr_sockaddr_t *sa;
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering};
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering/**
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Open the pipe-of-death. The pipe of death is used to tell all child
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * processes that it is time to die gracefully.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @param p The pool to use for allocating the pipe
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart PoetteringAP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod);
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering/**
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Check the pipe to determine if the process has been signalled to die.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart PoetteringAP_DECLARE(apr_status_t) ap_mpm_pod_check(ap_pod_t *pod);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering/**
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * Close the pipe-of-death
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart PoetteringAP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod);
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering/**
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Write data to the pipe-of-death, signalling that one child process
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * should die.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * @param p The pool to use when allocating any required structures.
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart PoetteringAP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod);
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering/**
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * Write data to the pipe-of-death, signalling that all child process
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering * should die.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @param p The pool to use when allocating any required structures.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @param num The number of child processes to kill
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering */
d4205751d4643c272059a3728045929dd0e5e800Lennart PoetteringAP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t *pod, int num);
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#endif
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#ifdef __cplusplus
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering}
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#endif
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering#endif /* !APACHE_MPM_COMMON_H */
5d6a86d7a034a1fb3d6e3f1b58e2c13739270894Lennart Poettering