Я написал таймер eventloop с epoll и linux API timerfd. Magpage из timerfd_gettime
гласит следующее:Проверьте, является ли time_t нулевым
The it_value field returns the amount of time until the timer will
next expire. If both fields of this structure are zero, then the
timer is currently disarmed.
Так, чтобы проверить, если таймер в настоящее время на охране или нет, я написал следующий код:
bool timer_is_running(struct timer *timer)
{
struct itimerspec timerspec;
if(timerfd_gettime(timer->_timer_fd, &timerspec) == -1) {
printf("[TIMER] Could not get timer '%s' running status\n", timer->name);
return false;
}
printf("[TIMER] Checking running state of timer '%s' it_value.tv_sec = %"PRIu64", it_value.tv_nsec = %"PRIu64"\n", timer->name, (uint64_t) timerspec.it_value.tv_sec, (uint64_t) timerspec.it_value.tv_nsec == 0);
return timerspec.it_value.tv_sec != 0 && timerspec.it_value.tv_nsec != 0;
}
Это не работает, и все таймеры были сообщены как разоруженные. когда я посмотрел на выходе я увидел следующее на данный момент разоружен таймер:
[TIMER] Checking running state of timer 'test' it_value.tv_sec = 0, it_value.tv_nsec = 4302591840
После дальнейшего расследования, кажется, только tv_sec
поля устанавливается в 0 на разоруженных таймерах.
Это программа работает под управлением ядра 3.18.23 по архитектуре MIPS (OpenWRT).
Прежде чем я укажу это как ошибку в реализации ядра, я хотел бы знать, правильно ли проверять, является ли time_t
0, делая time_t == 0
. Может ли кто-нибудь подтвердить это?
С наилучшими пожеланиями, Даан
Используйте '||' в возвращаемом выражении, а не '&&'. – Peter
Вы задали третий аргумент как 'timerspec.it_value.tv_nsec == 0'? Это будет оцениваться до '0', когда таймер имеет значение. Я спрашиваю, потому что это не будет 64-битное значение, соответствующее спецификации формата. –