wait_event_interruptible的代码

时间:2012-06-05 08:41:36

标签: linux kernel sleep

在哪里可以找到内核树中wait_event_interruptible的代码。 我能找到的是wait_event_interruptible定义为__wait_event_interruptible in。但我无法找到代码。 请帮帮我。

考虑一个由wait_event_interruptible进入睡眠状态的进程。假设现在有一个中断,并且中断处理程序唤醒(wake_up_event_interruptible)睡眠过程。如果wait_event_interruptible中给出的条件为真,那么成功唤醒的进程是什么?

由于

2 个答案:

答案 0 :(得分:4)

它位于include/linux/wait.h

#define wait_event_interruptible(wq, condition)               \
({                                                            \
    int __ret = 0;                                            \
    if (!(condition))                                         \
        __wait_event_interruptible(wq, condition, __ret);     \
    __ret;                                                    \
})

...

#define __wait_event_interruptible(wq, condition, ret)        \
do {                                                          \
    DEFINE_WAIT(__wait);                                      \
                                                              \
    for (;;) {                                                \
        prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE);    \
        if (condition)                                        \
            break;                                            \
        if (!signal_pending(current)) {                       \
            schedule();                                       \
            continue;                                         \
        }                                                     \
        ret = -ERESTARTSYS;                                   \
        break;                                                \
    }                                                         \
    finish_wait(&wq, &__wait);                                \
} while (0)

答案 1 :(得分:0)

回答你的第二个问题,是的。

每当中断处理程序(或任何其他线程)在waitqueue上调用wake_up()时,等待在waitqueue中的所有线程都会被唤醒并检查它们的条件。只有那些条件为真的线程才会继续,其余线程会重新进入休眠状态。 请参阅LDD3中的waitqueues

使用ctagscscope,以便您可以轻松找到这些定义。