Я пытаюсь отключить таймер, но не могу. Ниже приведен фрагмент для обработчика, который будет вызываться glib c (предположительно в отдельном контексте потока). Поток вызывает disarm_timer (который в конечном итоге вызывает timer_settime). Тем не менее, это не удается с INVALID ARGUMENT установить errno. Если я вызываю timer_settime из обработчика напрямую, то он работает нормально. В чем может быть проблема ? Время перезарядки работает нормально.
timer_t timerid;
static void t_thread(union sigval sig)
{
if (disarm_timer(timerid) < 0) {
printf("Bad\n");
} else {
printf("Done\n");
}
sleep(10);
(void)rearm_timer(timerid, 2, 0);
}
int disarm_timer(timer_t timerid)
{
struct itimerspec time_spec;
time_spec.it_value.tv_sec = 0;
time_spec.it_value.tv_nsec = 0;
if (timer_settime(timerid, 0, &time_spec, NULL) < 0) {
return -1;
}
return 0;
}
int rearm_timer(timer_t timerid, time_t tv_sec, long tv_nsec)
{
struct itimerspec time_spec;
if (!timerid) {
return -1;
}
time_spec.it_value.tv_sec = tv_sec;
time_spec.it_value.tv_nsec = tv_nsec;
time_spec.it_interval.tv_sec = tv_sec;
time_spec.it_interval.tv_nsec = tv_nsec;
if (timer_settime(timerid, 0, &time_spec, NULL) < 0) {
return -1;
}
return 0;
}