Author: philip Date: Mon Mar 20 01:27:41 2023 New Revision: 1908547 URL: http://svn.apache.org/viewvc?rev=1908547&view=rev Log: Add SIGTERM/SIGINT handling to svnserve, this allows it to exit more gracefully which allows tools like valgrind to monitor whether the program exits cleanly and do things like leak detection.
* subversion/svnserve/svnserve.c (sigtermint_handler): New handler. (accept_connection): Check for signal. (sub_main): Install handler, check for signal, add return. Modified: subversion/trunk/subversion/svnserve/svnserve.c Modified: subversion/trunk/subversion/svnserve/svnserve.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svnserve/svnserve.c?rev=1908547&r1=1908546&r2=1908547&view=diff ============================================================================== --- subversion/trunk/subversion/svnserve/svnserve.c (original) +++ subversion/trunk/subversion/svnserve/svnserve.c Mon Mar 20 01:27:41 2023 @@ -492,6 +492,15 @@ static void sigchld_handler(int signo) } #endif +#ifdef APR_HAVE_SIGACTION +static svn_atomic_t sigtermint_seen = 0; +static void +sigtermint_handler(int signo) +{ + svn_atomic_set(&sigtermint_seen, 1); +} +#endif /* APR_HAVE_SIGACTION */ + /* Redirect stdout to stderr. ARG is the pool. * * In tunnel or inetd mode, we don't want hook scripts corrupting the @@ -547,6 +556,10 @@ accept_connection(connection_t **connect status = apr_socket_accept(&(*connection)->usock, sock, connection_pool); +#if APR_HAVE_SIGACTION + if (sigtermint_seen) + break; +#endif if (handling_mode == connection_mode_fork) { apr_proc_t proc; @@ -1330,11 +1343,20 @@ sub_main(int *exit_code, int argc, const } #endif +#if APR_HAVE_SIGACTION + apr_signal(SIGTERM, sigtermint_handler); + apr_signal(SIGINT, sigtermint_handler); +#endif + while (1) { connection_t *connection = NULL; SVN_ERR(accept_connection(&connection, sock, ¶ms, handling_mode, pool)); +#if APR_HAVE_SIGACTION + if (sigtermint_seen) + break; +#endif if (run_mode == run_mode_listen_once) { err = serve_socket(connection, connection->pool); @@ -1391,7 +1413,7 @@ sub_main(int *exit_code, int argc, const close_connection(connection); } - /* NOTREACHED */ + return SVN_NO_ERROR; } int