sig_aux.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include <errno.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <signal.h>
  6. #include "sig_aux.h"
  7. /* Disable delivery of SIG_INIT and SIG_ACK. */
  8. void
  9. signals_disable(void)
  10. {
  11. sigset_t sigset;
  12. sigemptyset(&sigset);
  13. sigaddset(&sigset, SIG_TIMER);
  14. sigaddset(&sigset, SIG_CTIMER);
  15. sigaddset(&sigset, SIG_EPFD_TIMER);
  16. sigaddset(&sigset, SIG_ITIMER);
  17. sigaddset(&sigset, SIG_PFD_TIMER);
  18. if (sigprocmask(SIG_BLOCK, &sigset, NULL) < 0) {
  19. perror("signals_disable: sigprocmask");
  20. exit(1);
  21. }
  22. }
  23. /* Enable delivery of SIG_INIT and SIG_ACK. */
  24. void signals_enable(void)
  25. {
  26. sigset_t sigset;
  27. sigemptyset(&sigset);
  28. sigaddset(&sigset, SIG_TIMER);
  29. sigaddset(&sigset, SIG_CTIMER);
  30. sigaddset(&sigset, SIG_EPFD_TIMER);
  31. sigaddset(&sigset, SIG_ITIMER);
  32. sigaddset(&sigset, SIG_PFD_TIMER);
  33. if (sigprocmask(SIG_UNBLOCK, &sigset, NULL) < 0) {
  34. perror("signals_enable: sigprocmask");
  35. exit(1);
  36. }
  37. }
  38. void
  39. sig_SEGV_enable(void)
  40. {
  41. sigset_t sigset;
  42. sigaddset(&sigset, SIGSEGV);
  43. if (sigprocmask(SIG_UNBLOCK, &sigset, NULL) < 0) {
  44. perror("signals_enable: sigprocmask");
  45. exit(1);
  46. }
  47. }
  48. /* Install two signal handlers.
  49. * One for SIGCHLD, one for SIGALRM.
  50. * Make sure both signals are masked when one of them is running.
  51. */
  52. void install_signal_handlers(void)
  53. {
  54. sigset_t sigset;
  55. struct sigaction sa;
  56. sa.sa_flags = SA_RESTART | SA_SIGINFO;
  57. sigemptyset(&sigset);
  58. sa.sa_mask = sigset;
  59. sa.sa_sigaction = sig_TIMER_handler;
  60. if (sigaction(SIG_TIMER, &sa, NULL) < 0) {
  61. perror("sigaction: SIG_TIMER");
  62. exit(1);
  63. }
  64. #ifdef BASIC_PAXOS
  65. sa.sa_sigaction = sig_CTIMER_handler;
  66. if (sigaction(SIG_CTIMER, &sa, NULL) < 0) {
  67. perror("sigaction: SIG_CTIMER");
  68. exit(1);
  69. }
  70. sa.sa_sigaction = sig_ITIMER_handler;
  71. if (sigaction(SIG_ITIMER, &sa, NULL) < 0) {
  72. perror("sigaction: SIG_ITIMER");
  73. exit(1);
  74. }
  75. #endif
  76. #if defined(EPFD) || defined(tEPFD)
  77. sa.sa_sigaction = sig_EPFD_TIMER_handler;
  78. if (sigaction(SIG_EPFD_TIMER, &sa, NULL) < 0) {
  79. perror("sigaction: SIG_EPFD_TIMER");
  80. exit(1);
  81. }
  82. #endif
  83. #if defined(PFD) || defined(tPFD)
  84. sa.sa_sigaction = sig_PFD_TIMER_handler;
  85. if (sigaction(SIG_PFD_TIMER, &sa, NULL) < 0) {
  86. perror("sigaction: SIG_PFD_TIMER");
  87. exit(1);
  88. }
  89. #endif
  90. }