Linux / POSIX: timer_settime - невозможно отключить таймер из потока, сгенерированного таймером - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь отключить таймер, но не могу. Ниже приведен фрагмент для обработчика, который будет вызываться 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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...