X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=1e4caf08c90d0e04233a987f6e520e19850c20c5;hp=9c06991378512172e95b70165118ae1ea873bdb1;hb=46f2f102fa22ddffe515546e7db21cf208db0d90;hpb=26d662890f5e1c29c0b09d1cac94b8b4acb065ed diff --git a/server.c b/server.c index 9c069913..1e4caf08 100644 --- a/server.c +++ b/server.c @@ -300,6 +300,9 @@ static void signal_post_select(struct sched *s, struct task *t) PARA_EMERG_LOG("terminating on signal %d\n", st->signum); genocide: kill(0, SIGTERM); + free(mmd->afd.afhi.chunk_table); + free(mmd->afd.afhi.info_string); + close_listed_fds(); mutex_destroy(mmd_mutex); shm_detach(mmd); exit(EXIT_FAILURE); @@ -467,6 +470,12 @@ static int init_afs(void) return afs_server_socket[0]; } +__noreturn static void tmp_sigchld_handler(__a_unused int s) +{ + PARA_EMERG_LOG("caught early SIGCHLD\n"); + exit(EXIT_FAILURE); +} + static void server_init(int argc, char **argv) { struct server_cmdline_parser_params params = { @@ -509,6 +518,15 @@ static void server_init(int argc, char **argv) PARA_EMERG_LOG("failed to ignore SIGUSR1\n"); exit(EXIT_FAILURE); } + /* + * We have to install a SIGCHLD handler before the afs process is being + * forked off. Otherwise, para_server does not notice if afs dies before + * the SIGCHLD handler has been installed by init_signal_task() below. + */ + if (signal(SIGCHLD, tmp_sigchld_handler) == SIG_ERR) { + PARA_EMERG_LOG("failed to install temporary SIGCHLD handler\n"); + exit(EXIT_FAILURE); + } PARA_NOTICE_LOG("initializing the audio file selector\n"); afs_socket = init_afs(); init_signal_task();