xz: Avoid SA_RESTART for portability reasons.
authorLasse Collin <lasse.collin@tukaani.org>
Mon, 11 Oct 2010 18:26:19 +0000 (21:26 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Mon, 11 Oct 2010 18:26:19 +0000 (21:26 +0300)
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.

src/xz/message.c
src/xz/message.h
src/xz/signals.c

index 3f2b813..c73099e 100644 (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
 
index 37e6082..ba1d322 100644 (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.
index 7e65b2a..ff524d1 100644 (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