mirror of https://git.tukaani.org/xz.git
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:
parent
d52b411716
commit
ac462b1c47
|
@ -77,6 +77,17 @@ static uint64_t start_time;
|
||||||
// gettimeofday().
|
// gettimeofday().
|
||||||
#ifdef SIGALRM
|
#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
|
/// The signal handler for SIGALRM sets this to true. It is set back to false
|
||||||
/// once the progress message has been updated.
|
/// once the progress message has been updated.
|
||||||
static volatile sig_atomic_t progress_needs_updating = false;
|
static volatile sig_atomic_t progress_needs_updating = false;
|
||||||
|
@ -142,34 +153,15 @@ message_init(void)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef SIGALRM
|
#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
|
// Establish the signal handlers which set a flag to tell us that
|
||||||
// progress info should be updated. Since these signals don't
|
// progress info should be updated.
|
||||||
// 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
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
sigemptyset(&sa.sa_mask);
|
sigemptyset(&sa.sa_mask);
|
||||||
sa.sa_flags = SA_RESTART;
|
sa.sa_flags = 0;
|
||||||
sa.sa_handler = &progress_signal_handler;
|
sa.sa_handler = &progress_signal_handler;
|
||||||
|
|
||||||
for (size_t i = 0; i < ARRAY_SIZE(sigs); ++i)
|
for (size_t i = 0; message_progress_sigs[i] != 0; ++i)
|
||||||
if (sigaction(sigs[i], &sa, NULL))
|
if (sigaction(message_progress_sigs[i], &sa, NULL))
|
||||||
message_signal_handler();
|
message_signal_handler();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -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
|
/// \brief Initializes the message functions
|
||||||
///
|
///
|
||||||
/// If an error occurs, this function doesn't return.
|
/// If an error occurs, this function doesn't return.
|
||||||
|
|
|
@ -71,6 +71,12 @@ signals_init(void)
|
||||||
for (size_t i = 0; i < ARRAY_SIZE(sigs); ++i)
|
for (size_t i = 0; i < ARRAY_SIZE(sigs); ++i)
|
||||||
sigaddset(&hooked_signals, 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;
|
struct sigaction sa;
|
||||||
|
|
||||||
// All the signals that we handle we also blocked while the signal
|
// All the signals that we handle we also blocked while the signal
|
||||||
|
|
Loading…
Reference in New Issue