/* Like poll(), except: * * - On error, returns a negative error code (instead of setting errno). * * - If interrupted by a signal, retries automatically until the original * 'timeout' expires. (Because of this property, this function will * never return -EINTR.) * * - As a side effect, refreshes the current time (like time_refresh()). */ int time_poll(struct pollfd *pollfds, int n_pollfds, long long int timeout_when, int * elapsed) { long long int start; sigset_t oldsigs; bool blocked; int retval; time_refresh(); start = time_msec(); blocked = false; for (;;) { long long int now = time_msec(); int time_left; if (now >= timeout_when) { time_left = 0; printf("time_left: 0\n"); } else if ((unsigned long long int) timeout_when - now > INT_MAX) { time_left = INT_MAX; printf("time_left: INT_MAX\n"); } else { time_left = timeout_when - now; printf("time_left: %d\n", time_left); } retval = poll(pollfds, n_pollfds, time_left); printf("time_poll -> return from poll: %d\n", retval); if (retval < 0) { retval = -errno; perror("time_poll"); } if (retval != -EINTR) { break; } if (!blocked && deadline == TIME_MIN) { // block_sigalrm(&oldsigs); blocked = true; } time_refresh(); } if (blocked) { // unblock_sigalrm(&oldsigs); } return retval; }
static void refresh_if_ticked(void) { assert(inited); if (tick) { time_refresh(); } }
/* Like poll(), except: * * - On error, returns a negative error code (instead of setting errno). * * - If interrupted by a signal, retries automatically until the original * 'timeout' expires. (Because of this property, this function will * never return -EINTR.) * * - As a side effect, refreshes the current time (like time_refresh()). */ int time_poll(struct pollfd *pollfds, int n_pollfds, int timeout) { long long int start; sigset_t oldsigs; bool blocked; int retval; time_refresh(); start = time_msec(); blocked = false; for (;;) { int time_left; if (timeout > 0) { long long int elapsed = time_msec() - start; time_left = timeout >= elapsed ? timeout - elapsed : 0; } else { time_left = timeout; } retval = poll(pollfds, n_pollfds, time_left); if (retval < 0) { retval = -errno; } if (retval != -EINTR) { break; } if (!blocked && deadline == TIME_MIN) { block_sigalrm(&oldsigs); blocked = true; } time_refresh(); } if (blocked) { unblock_sigalrm(&oldsigs); } return retval; }