void mainLoop() { TRACE_POINT(); boost::function<void ()> func; func = boost::bind(&MessageServer::mainLoop, messageServer.get()); messageServerThread = ptr(new oxt::thread( boost::bind(runAndPrintExceptions, func, true), "MessageServer thread", MESSAGE_SERVER_THREAD_STACK_SIZE )); poolLoop.start("Pool event loop", 0); requestLoop.start("Request event loop", 0); /* Wait until the watchdog closes the feedback fd (meaning it * was killed) or until we receive an exit message. */ this_thread::disable_syscall_interruption dsi; fd_set fds; int largestFd; FD_ZERO(&fds); FD_SET(feedbackFd, &fds); FD_SET(exitEvent.fd(), &fds); largestFd = (feedbackFd > exitEvent.fd()) ? (int) feedbackFd : exitEvent.fd(); UPDATE_TRACE_POINT(); installDiagnosticsDumper(); if (syscalls::select(largestFd + 1, &fds, NULL, NULL, NULL) == -1) { int e = errno; uninstallDiagnosticsDumper(); throw SystemException("select() failed", e); } if (FD_ISSET(feedbackFd, &fds)) { /* If the watchdog has been killed then we'll kill all descendant * processes and exit. There's no point in keeping this helper * server running because we can't detect when the web server exits, * and because this helper agent doesn't own the server instance * directory. As soon as passenger-status is run, the server * instance directory will be cleaned up, making this helper agent * inaccessible. */ P_DEBUG("Watchdog seems to be killed; forcing shutdown of all subprocesses"); syscalls::killpg(getpgrp(), SIGKILL); _exit(2); // In case killpg() fails. } else { /* We received an exit command. We want to exit 5 seconds after * all clients have disconnected have become inactive. */ P_DEBUG("Received command to exit gracefully. " "Waiting until 5 seconds after all clients have disconnected..."); while (requestHandler->inactivityTime() < 5000) { syscalls::usleep(250000); } P_DEBUG("It's now 5 seconds after all clients have disconnected. " "Proceeding with graceful exit."); } }
void mainLoop() { TRACE_POINT(); messageServerThread.reset(new oxt::thread( boost::bind(&MessageServer::mainLoop, messageServer.get()), "MessageServer thread", MESSAGE_SERVER_STACK_SIZE )); /* Wait until the watchdog closes the feedback fd (meaning it * was killed) or until we receive an exit message. */ this_thread::disable_syscall_interruption dsi; fd_set fds; int largestFd; FD_ZERO(&fds); FD_SET(feedbackFd, &fds); FD_SET(exitEvent.fd(), &fds); largestFd = (feedbackFd > exitEvent.fd()) ? (int) feedbackFd : exitEvent.fd(); UPDATE_TRACE_POINT(); if (syscalls::select(largestFd + 1, &fds, NULL, NULL, NULL) == -1) { int e = errno; throw SystemException("select() failed", e); } if (FD_ISSET(feedbackFd, &fds)) { /* If the watchdog has been killed then we'll kill all descendant * processes and exit. There's no point in keeping this helper * server running because we can't detect when the web server exits, * and because this helper server doesn't own the server instance * directory. As soon as passenger-status is run, the server * instance directory will be cleaned up, making this helper server * inaccessible. */ syscalls::killpg(getpgrp(), SIGKILL); _exit(2); // In case killpg() fails. } else { /* We received an exit command. We want to exit 5 seconds after * the last client has disconnected, . */ exitTimer.start(); exitTimer.wait(5000); } }