static void sigalrm_handler(int sig_nr) { tick = true; if (deadline != TIME_MIN && time(0) > deadline) { fatal_signal_handler(sig_nr); } }
static void sigalrm_handler(int sig_nr) { tick = true; printf("handled signal: %d\n", sig_nr); if (deadline != TIME_MIN && time(0) > deadline) { printf("calling fatal_signal_handler\n"); fatal_signal_handler(sig_nr); } }
/* Like poll(), except: * * - The timeout is specified as an absolute time, as defined by * time_msec(), instead of a duration. * * - On error, returns a negative error code (instead of setting errno). * * - If interrupted by a signal, retries automatically until the original * timeout is reached. (Because of this property, this function will * never return -EINTR.) * * Stores the number of milliseconds elapsed during poll in '*elapsed'. */ int time_poll(struct pollfd *pollfds, int n_pollfds, long long int timeout_when, int *elapsed) { long long int *last_wakeup = last_wakeup_get(); long long int start; int retval; time_init(); coverage_clear(); coverage_run(); if (*last_wakeup) { log_poll_interval(*last_wakeup); } start = time_msec(); timeout_when = MIN(timeout_when, deadline); for (;;) { long long int now = time_msec(); int time_left; if (now >= timeout_when) { time_left = 0; } else if ((unsigned long long int) timeout_when - now > INT_MAX) { time_left = INT_MAX; } else { time_left = timeout_when - now; } retval = poll(pollfds, n_pollfds, time_left); if (retval < 0) { retval = -errno; } if (deadline <= time_msec()) { fatal_signal_handler(SIGALRM); if (retval < 0) { retval = 0; } break; } if (retval != -EINTR) { break; } } *last_wakeup = time_msec(); refresh_rusage(); *elapsed = *last_wakeup - start; return retval; }