rem: sigemptyset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO;
context: int blomcall_init (void) {  struct sigaction sa;  struct sigevent ev;#ifdef BLOMCALL_USES_OBSOLETE_SIGHANDLER      // Install signal handler for SIGUSR1 (timer) and SIGUSR2  sa.sa_handler = (__sighandler_t) blomcall_timer_handler;  sigemptyset(&sa.sa_mask);  sa.sa_flags = 0;  if (sigaction(SIGUSR1, &sa, NULL) == -1 ) {    perror("sigaction(SIGUSR1)");    return 0;  }  sa.sa_handler = (__sighandler_t) blomcall_resume_handler;  sigemptyset(&sa.sa_mask);  sa.sa_flags = SA_RESTART;  if (sigaction(SIGUSR2, &sa, NULL) == -1 ) {    perror("sigaction(SIGUSR2)");    return 0;  }#else  // Install signal handler for SIGUSR1 (timer) and SIGUSR2  sa.sa_sigaction = blomcall_timer_handler;  sigemptyset(&sa.sa_mask);  sa.sa_flags = SA_SIGINFO;  if (sigaction(SIGUSR1, &sa, NULL) == -1 ) {    perror("sigaction(SIGUSR1)");    return 0;  }  sa.sa_sigaction = blomcall_resume_handler;  sigemptyset(&sa.sa_mask);  sa.sa_flags = SA_SIGINFO;  if (sigaction(SIGUSR2, &sa, NULL) == -1 ) {    perror("sigaction(SIGUSR2)");    return 0;  }#endif    // Block SIGUSR1 signals (from the timer)  sigemptyset(&blomcall_usr1sigset);  sigaddset(&blomcall_usr1sigset, SIGUSR1);    if (pthread_sigmask(SIG_BLOCK, &blomcall_usr1sigset, NULL) == -1) {    perror("pthread_sigmask");    return 0;  }  // Block SIGUSR2 signals  sigemptyset(&blomcall_usr2sigset);  sigaddset(&blomcall_usr2sigset, SIGUSR2);  if (pthread_sigmask(SIG_BLOCK, &blomcall_usr2sigset, NULL) == -1) {    perror("pthread_sigmask");    return 0;  }    // Create a timer that generates SIGUSR1 signals  ev.sigev_notify = SIGEV_SIGNAL;  ev.sigev_signo  = SIGUSR1;  if (timer_create (CLOCK_REALTIME, &ev, &blomcall_timer) == -1) {    perror("timer_create");    return 0;  }  // Start it  if (timer_settime(blomcall_timer, 0, &blomcall_timer_cont, NULL) == -1) {    perror("timer_settime");    return 0;  }  return 1;}