xz: Avoid SA_RESTART for portability reasons.

SA_RESTART is not as portable as I had hoped. It's missing
at least from OpenVMS, QNX, and DJGPP). Luckily we can do
fine without SA_RESTART.
This commit is contained in:
Lasse Collin 2010-10-11 21:26:19 +03:00
parent d52b411716
commit ac462b1c47
3 changed files with 25 additions and 23 deletions

View File

@ -77,6 +77,17 @@ static uint64_t start_time;
// gettimeofday().
#ifdef SIGALRM
const int message_progress_sigs[] = {
SIGALRM,
#ifdef SIGINFO
SIGINFO,
#endif
#ifdef SIGUSR1
SIGUSR1,
#endif
0
};
/// The signal handler for SIGALRM sets this to true. It is set back to false
/// once the progress message has been updated.
static volatile sig_atomic_t progress_needs_updating = false;
@ -142,34 +153,15 @@ message_init(void)
*/
#ifdef SIGALRM
// DJGPP lacks SA_RESTART, but it shouldn't give EINTR
// in most places either.
# if defined(__DJGPP__) && !defined(SA_RESTART)
# define SA_RESTART 0
# endif
// Establish the signal handlers which set a flag to tell us that
// progress info should be updated. Since these signals don't
// require any quick action, we set SA_RESTART. That way we don't
// need to block them either in signals_block() to keep stdio
// functions from getting EINTR.
static const int sigs[] = {
SIGALRM,
#ifdef SIGINFO
SIGINFO,
#endif
#ifdef SIGUSR1
SIGUSR1,
#endif
};
// progress info should be updated.
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sa.sa_flags = 0;
sa.sa_handler = &progress_signal_handler;
for (size_t i = 0; i < ARRAY_SIZE(sigs); ++i)
if (sigaction(sigs[i], &sa, NULL))
for (size_t i = 0; message_progress_sigs[i] != 0; ++i)
if (sigaction(message_progress_sigs[i], &sa, NULL))
message_signal_handler();
#endif

View File

@ -20,6 +20,10 @@ enum message_verbosity {
};
/// \brief Signals used for progress message handling
extern const int message_progress_sigs[];
/// \brief Initializes the message functions
///
/// If an error occurs, this function doesn't return.

View File

@ -71,6 +71,12 @@ signals_init(void)
for (size_t i = 0; i < ARRAY_SIZE(sigs); ++i)
sigaddset(&hooked_signals, sigs[i]);
#ifdef SIGALRM
// Add also the signals from message.c to hooked_signals.
for (size_t i = 0; message_progress_sigs[i] != 0; ++i)
sigaddset(&hooked_signals, message_progress_sigs[i]);
#endif
struct sigaction sa;
// All the signals that we handle we also blocked while the signal