+/*
+ * what low-level signal handlers looked like before
+ * undoably_install_low_level_interrupt_handler() got involved
+ */
+struct low_level_signal_handler_state {
+ int was_modified;
+ void (*handler)(int, siginfo_t*, void*);
+} old_low_level_signal_handler_states[NSIG];
+
+void
+uninstall_low_level_interrupt_handlers_atexit(void)
+{
+ int signal;
+ for (signal = 0; signal < NSIG; ++signal) {
+ struct low_level_signal_handler_state
+ *old_low_level_signal_handler_state =
+ old_low_level_signal_handler_states + signal;
+ if (old_low_level_signal_handler_state->was_modified) {
+ struct sigaction sa;
+ sa.sa_sigaction = old_low_level_signal_handler_state->handler;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_SIGINFO | SA_RESTART;
+ sigaction(signal, &sa, NULL);
+ }
+ }
+}
+