LINUX.ORG.RU

Растолкуйте про wait_event_interruptible_timeout


0

1

Ибо сказано:

The function returns 0 if the timeout elapsed, -ERESTARTSYS if it was interrupted by a signal, and the remaining jiffies otherwise if the condition evaluated to true before the timeout elapsed.

Использую функцию в модуле ядра. Если обработчик прерывания отработал, возвращается 500 (это мой timeout), если нет - 0. В каком случае функция вернет -ERESTARTSYS?

★★
Ответ на: комментарий от metawishmaster

Если бы я не заглянул на первую страницу трекера... =)

А по сабжу, да, я проверю, но ЕМПИМП, ERESTARTSYS я еще не получал за время эксплуатации драйвера.

Либо таймаут, либо jiffies.

Завтра буду глядеть.

braboar ★★
() автор топика
Ответ на: комментарий от metawishmaster

И, конечно, спасибо, но доки уже прочитаны.

Мне интересно, КАКОЙ сигнал может прийти, если выход получается либо по тайм-ауту, либо с успешным завершением.

braboar ★★
() автор топика
Ответ на: комментарий от braboar

ну... например пошли проге, юзающей драйвер, SIGINT %)

а вообще,

It is worth repeating that driver writers should almost always use the interruptible instances of these functions/macros. The noninterruptible version exists for the small number of situations in which signals cannot be dealt with, for example, when waiting for a data page to be retrieved from swap space. Most drivers do not present such special situations.

(c) Linux Device Drivers

metawishmaster ★★★★★
()
Ответ на: комментарий от metawishmaster

Ну, против LDD не попрешь, тем более, что в коде и так interruptible используется.

Спасибо за внимание!

braboar ★★
() автор топика

Правильный ответ — быть хоть немного самостоятельным и посмотреть код, не?

Исходники доступны всем, они не только у ЛОРовских аналитиков дома.

#define __wait_event_interruptible_timeout(wq, condition, ret)          \
do {                                                                    \
        DEFINE_WAIT(__wait);                                            \
                                                                        \
        for (;;) {                                                      \
                prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE);      \
                if (condition)                                          \
                        break;                                          \
                if (!signal_pending(current)) {                         \
                        ret = schedule_timeout(ret);                    \
                        if (!ret)                                       \
                                break;                                  \
                        continue;                                       \
                }                                                       \
                ret = -ERESTARTSYS;                                     \
                break;                                                  \
        }                                                               \
        finish_wait(&wq, &__wait);                                      \
} while (0)
ttnl ★★★★★
()
Ответ на: комментарий от ttnl

Не можешь рассказать словами значение каждой строчки? Сам не разбираешься? Код скопипастить каждый может.

anonymous
()
Ответ на: комментарий от braboar

какой сигнал имеется в виду

Чувак, ну ты даёшь. А какой ты думаешь сигнал имееться ввиду? Да и вообще, почитай про этот самый erestart, его не только wait_interruptible and Co. возвращает.

nanoolinux ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.