dexter.c revision 9ecf4c650535acf4d966f102e665af79ec97c01a
0N/A/* ==================================================================== 0N/A * The Apache Software License, Version 1.1 0N/A * Copyright (c) 2000 The Apache Software Foundation. All rights 0N/A * Redistribution and use in source and binary forms, with or without 0N/A * modification, are permitted provided that the following conditions 0N/A * 1. Redistributions of source code must retain the above copyright 0N/A * notice, this list of conditions and the following disclaimer. 0N/A * 2. Redistributions in binary form must reproduce the above copyright 0N/A * notice, this list of conditions and the following disclaimer in 0N/A * the documentation and/or other materials provided with the 0N/A * 3. The end-user documentation included with the redistribution, 0N/A * if any, must include the following acknowledgment: 0N/A * "This product includes software developed by the 0N/A * Alternately, this acknowledgment may appear in the software itself, 0N/A * if and wherever such third-party acknowledgments normally appear. 0N/A * 4. The names "Apache" and "Apache Software Foundation" must 0N/A * not be used to endorse or promote products derived from this 0N/A * software without prior written permission. For written 0N/A * permission, please contact apache@apache.org. 0N/A * 5. Products derived from this software may not be called "Apache", 0N/A * nor may "Apache" appear in their name, without prior written 0N/A * permission of the Apache Software Foundation. 0N/A * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 0N/A * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 0N/A * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 0N/A * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 0N/A * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 0N/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 0N/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 0N/A * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 0N/A * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 955N/A * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 955N/A * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 955N/A * ==================================================================== 955N/A * This software consists of voluntary contributions made by many 955N/A * individuals on behalf of the Apache Software Foundation. For more 955N/A * information on the Apache Software Foundation, please see 0N/A * Portions of this software are based upon public domain software 0N/A * originally written at the National Center for Supercomputing Applications, 0N/A * University of Illinois, Urbana-Champaign. 0N/A * Actual definitions of config globals 0N/A * The max child slot ever assigned, preserved across restarts. Necessary 0N/A * to deal with NumServers changes across SIGWINCH restarts. We use this 0N/A * value to optimize routines that have to scan the entire child table. 0N/A * XXX - It might not be worth keeping this code in. There aren't very 0N/A * many child processes in this MPM. 0N/A/* *Non*-shared http_main globals... */ 0N/A/* one_process --- debugging mode variable; can be set from the command line 0N/A * with the -X flag. If set, this gets you the child_main loop running 0N/A * in the process which originally started up (no detach, no make_child), 0N/A * which is a pretty nice debugging environment. (You'll get a SIGHUP 0N/A * early in standalone_main; just continue through. This is the server * trying to kill off any child processes which it might have lying * around --- Apache doesn't keep track of their pids, it just sends * SIGHUP to the process group, ignoring it in the root process. * Continue through and you'll be fine.). static int my_pid;
/* Linux getpid() doesn't work except in main thread. Use /* Keep track of the number of worker threads currently active */ /* Keep track of the number of idle worker threads */ /* Locks for accept serialization */ #
endif /* NO_SERIALIZED_ACCEPT *//* a clean exit from a child with proper cleanup */ /* handle all varieties of core dumping signals */ /* At this point we've got sig blocked, because we're still inside * the signal handler. When we leave the signal handler it will * be unblocked, and we'll take the signal... and coredump or whatever * is appropriate for this particular Unix. In addition the parent * will see the real signal we received -- whereas if we called * abort() here, the parent would only see SIGABRT. /***************************************************************** * Connection structures and accounting... /* volatile just in case */ * ap_start_shutdown() and ap_start_restart(), below, are a first stab at * functions to initiate shutdown or restart without relying on signals. * Previously this was initiated in sig_term() and restart() signal handlers, * e.g. on Win32, from the service manager. Now the service manager can * call ap_start_shutdown() or ap_start_restart() as appropiate. Note that * these functions can also be called by the child processes, since global * variables are no longer used to pass on the required action to the parent. * These should only be called from the parent process itself, since the * parent process will use the shutdown_pending and restart_pending variables * to determine whether to shutdown or restart. The child process should * call signal_parent() directly to tell the parent to die -- this will * cause neither of those variable to be set, which the parent will * assume means something serious is wrong (which it will be, for the * child to force an exit) and so do an exit anyway. /* Um, is this _probably_ not an error, if the user has * tried to do a shutdown twice quickly, so we won't * worry about reporting it. /* do a graceful restart if graceful == 1 */ /* Probably not an error - don't bother reporting it */ /* we want to ignore HUPs and WINCH while we're busy processing one */ /* Child died... if it died due to a fatal error, * we should simply bail out. "Child %ld returned a Fatal error... \n" "child pid %ld exit signal %s (%d), " "possible coredump in %s",
"child pid %ld exit signal %s (%d)",
"child pid %ld exit signal %d",
/***************************************************************** * Here follows a long bunch of generic server bookkeeping stuff... /* The Nagle algorithm says that we should delay sending partial * packets in hopes of getting more data. We don't want to do * this; we are not telnet. There are bad interactions between * persistent connections and Nagle's algorithm that have very severe * performance penalties. (Failing to disable Nagle is not much of a * problem with simple HTTP.) * In spite of these problems, failure here is not a shooting offense. "setsockopt: (TCP_NODELAY)");
/* XXX - Does this really work? - Manoj */ /***************************************************************** * Child process main loop. "filedescriptor (%u) larger than FD_SETSIZE (%u) " "found, you probably need to rebuild Apache with a " "error attaching to socket");
/* Starts a thread as long as we're below max_threads */ "pthread_create: unable to create worker thread");
/* In case system resources are maxxed out, we don't want Apache running away with the CPU trying to fork over and over and over again if we exit. */ "server reached MaxThreadsPerChild setting, consider raising the" " MaxThreadsPerChild or NumServers settings");
/* Sets workers_may_exit if we received a character on the pipe_of_death */ /* It lost the lottery. It must continue to suffer * through a life of servitude. */ /* It won the lottery (or something else is very * wrong). Embrace death with open arms. */ /* idle_thread_count should be incremented before starting a worker_thread */ "ap_lock failed. Attempting to shutdown " /* poll() will only return errors in catastrophic * circumstances. Let's try exiting gracefully, for now. */ /* A process got a signal on the shutdown pipe. Check if we're * the lucky process to die. */ /* XXX: Should we check for POLLERR? */ "ap_unlock failed. Attempting to shutdown " "ap_unlock failed. Attempting to shutdown " /* All the threads have exited, now finish the shutdown process * by signalling the sigwait thread */ /*stuff to do before we switch id's, so we have permissions.*/ "Couldn't initialize cross-process lock in child");
/*done with init critical section */ /* All threads should mask signals out, accoring to sigwait(2) man page */ /* Set up the pollfd array */ /* Setup worker threads */ /* We are creating worker threads right now */ /* start_thread shouldn't fail here */ /* This thread will be the one responsible for handling signals */ "fork: Unable to fork new process");
/* In case system resources are maxxed out, we don't want Apache running away with the CPU trying to fork over and /* By default, AIX binds to a single processor. This bit unbinds children which will then bind to another CPU. /* XXX - For an unthreaded server, a signal handler will be necessary ap_signal(SIGTERM, just_die); /* start up a bunch of children */ * spawn_rate is the number of children that will be spawned on the * next maintenance cycle if there aren't enough servers. It is * doubled up to MAX_SPAWN_RATE, and reset only when a cycle goes by * without the need to spawn. /* initialize the free_list */ /* the next time around we want to spawn twice as many if this * wasn't good enough, but not if we've just done a graceful /* non-fatal death... note that it's gone in the child table and * clean out the status table. */ /* we're still doing a 1-for-1 replacement of dead * children with new children /* Great, we've probably just lost a slot in the * child table. Somehow we don't know about this "long lost child came home! (pid %ld)",
/* Don't perform idle maintenance when a child dies, * only do it when there's a timeout. Remember only a * finite number of children can die, and it's pretty * pathological for a lot to die suddenly. /* we hit a 1 second timeout in which none of the previous * generation of children needed to be reaped... so assume * they're all done, and pick up the slack if any is left. /* In any event we really shouldn't do the code below because * few of the servers we just started are in the IDLE state * yet, so we'd mistakenly create an extra server. "pipe: (pipe_of_death)");
"fcntl: O_NONBLOCKing (pipe_of_death)");
/* XXX: hey, what's the right way for the mpm to indicate a fatal error? */ "no listening sockets available, shutting down");
/* Initialize cross-process accept lock */ "Couldn't create cross-process lock");
/* Initialize the child table */ /* 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 * below (because we just sent them SIGWINCH). This happens pretty * rapidly... and for each one that exits we'll start a new one until * we reach at least daemons_min_free. But we may be permitted to * start more than that, so we'll just keep track of how many we're * supposed to start up without the 1 second penalty between each fork. /* give the system some time to recover before kicking into "%s configured -- resuming normal operations",
/* Time to gracefully shut down: * Kill child processes, tell them to call child_exit, etc... /* cleanup pid file on normal shutdown */ "removed PID file %s (pid=%ld)",
/* we've been told to restart */ /* not worth thinking about */ "SIGWINCH received. Doing graceful restart");
/* This is mostly for debugging... so that we know what is still * gracefully dealing with existing request. /* give the children the signal to die */ /* Kill 'em all. Since the child acts the same on the parents SIGTERM * and a SIGHUP, we may as well use the same signal, because some user * pthreads are stealing signals from us left and right. /* sigh, want this only the second time around */ return "PidFile directive not allowed in <VirtualHost>";
"WARNING: NumServers of %d exceeds compile time limit " " lowering NumServers to %d. To increase, please " "WARNING: Require NumServers > 0, setting to 1");
"WARNING: StartThreads of %d exceeds compile time" "lowering StartThreads to %d. To increase, please" "WARNING: Require StartThreads > 0, setting to 1");
"WARNING: detected MinSpareThreads set to non-positive.");
"Resetting to 1 to avoid almost certain Apache failure.");
"Please read the documentation.");
"WARNING: detected MinSpareThreads set higher than");
"WARNING: detected MaxThreadsPerChild set higher than");
" does not exist or is not a directory",
NULL);
"A file for logging the server process ID"},
"The lockfile used when Apache needs to lock the accept() call"},
"Number of children alive at the same time" },
"Number of threads each child creates" },
"Minimum number of idle threads per child, to handle request spikes" },
"Maximum number of idle threads per child" },
"Maximum number of threads per child" },
"Maximum number of requests a particular child serves before dying." },
"Whether or not to maintain status information on current connections"},
"The location of the directory Apache changes to before dumping core" },
NULL,
/* hook to run before apache parses args */ NULL,
/* create per-directory config structure */ NULL,
/* merge per-directory config structures */ NULL,
/* create per-server config structure */ NULL,
/* merge per-server config structures */