X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=79e67818c87a1573b312c00091c8199f41c286ed;hp=9c06991378512172e95b70165118ae1ea873bdb1;hb=3781a3df94ce9bb28c98369df7a140fb4c086c23;hpb=0ea88fa418c5133f8add1c2eabdd3369942cc77e diff --git a/server.c b/server.c index 9c069913..79e67818 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); @@ -315,25 +318,15 @@ static void init_signal_task(void) st->task.post_select = signal_post_select; sprintf(st->task.status, "signal task"); + PARA_NOTICE_LOG("setting up signal handling\n"); st->fd = para_signal_init(); /* always successful */ - - PARA_NOTICE_LOG("setting up signal handlers\n"); - if (para_install_sighandler(SIGINT) < 0) - goto err; - if (para_install_sighandler(SIGTERM) < 0) - goto err; - if (para_install_sighandler(SIGHUP) < 0) - goto err; - if (para_install_sighandler(SIGCHLD) < 0) - goto err; - if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) - goto err; + para_install_sighandler(SIGINT); + para_install_sighandler(SIGTERM); + para_install_sighandler(SIGHUP); + para_install_sighandler(SIGCHLD); + para_sigaction(SIGPIPE, SIG_IGN); add_close_on_fork_list(st->fd); register_task(&st->task); - return; -err: - PARA_EMERG_LOG("could not install signal handlers\n"); - exit(EXIT_FAILURE); } static void command_pre_select(struct sched *s, struct task *t) @@ -467,6 +460,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 = { @@ -505,10 +504,13 @@ static void server_init(int argc, char **argv) * before the child gets a chance to ignore this signal -- only the * good die young. */ - if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) { - PARA_EMERG_LOG("failed to ignore SIGUSR1\n"); - exit(EXIT_FAILURE); - } + para_sigaction(SIGUSR1, SIG_IGN); + /* + * 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. + */ + para_sigaction(SIGCHLD, tmp_sigchld_handler); PARA_NOTICE_LOG("initializing the audio file selector\n"); afs_socket = init_afs(); init_signal_task();