mirror of
https://git.tukaani.org/xz.git
synced 2024-04-04 12:36:23 +02:00
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
3 changed files with 25 additions and 23 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue