X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=signal.c;h=32d6ab6624e5f493ac393b630a603c0968f11497;hp=9153349fa8b20e96e56dfac3522aebdc2a6ebaff;hb=HEAD;hpb=a61e862450dc1e74394bf5bbf7002d9947f98d31 diff --git a/signal.c b/signal.c index 9153349f..d9a6aa37 100644 --- a/signal.c +++ b/signal.c @@ -1,8 +1,4 @@ -/* - * Copyright (C) 2004 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 2004 Andre Noll , see file COPYING. */ /** \file signal.c Signal handling functions. */ #include @@ -31,7 +27,7 @@ static int signal_pipe[2]; * signal arrives, the signal handler writes the number of the signal received * to one end of the signal pipe. The application can test for pending signals * by checking if the file descriptor of the other end of the signal pipe is - * ready for reading, see select(2). + * ready for reading. * * \return This function either succeeds or calls exit(3) to terminate the * current process. On success, a signal task structure is returned. @@ -52,7 +48,7 @@ struct signal_task *signal_init_or_die(void) ret = mark_fd_nonblocking(signal_pipe[1]); if (ret < 0) goto err_out; - st = para_calloc(sizeof(*st)); + st = zalloc(sizeof(*st)); st->fd = signal_pipe[0]; return st; err_out: @@ -76,10 +72,13 @@ static void generic_signal_handler(int s) errno = save_errno; return; } - if (ret < 0) - PARA_EMERG_LOG("%s\n", strerror(errno)); - else - PARA_EMERG_LOG("short write to signal pipe\n"); + /* + * This is a fatal error which should never happen. We must not call + * PARA_XXX_LOG() here because this might acquire the log mutex which + * is already taken by the main program if the interrupt occurs while a + * log message is being printed. The mutex will not be released as long + * as this signal handler is running, so a deadlock ensues. + */ exit(EXIT_FAILURE); } @@ -206,16 +205,14 @@ void para_unblock_signal(int sig) /** * Return the number of the next pending signal. * - * \param rfds The fd_set containing the signal pipe. - * * \return On success, the number of the received signal is returned. If there * is no signal currently pending, the function returns zero. On read errors * from the signal pipe, the process is terminated. */ -int para_next_signal(fd_set *rfds) +int para_next_signal(void) { size_t n; - int s, ret = read_nonblock(signal_pipe[0], &s, sizeof(s), rfds, &n); + int s, ret = read_nonblock(signal_pipe[0], &s, sizeof(s), &n); if (ret < 0) { PARA_EMERG_LOG("%s\n", para_strerror(-ret));