prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)
这个函数也是等待队列使用的基本函数
这个函数的作用有三个:
1:清空wait 中的WQ_FLAG_EXCLUSIVE
2:如果wait->task_list 为bull,则调用__add_wait_queue 将wait_queue_t *wait 添加到wait_queue_head_t *q的最前面
3:通过set_current_state 设置当前thread的状态为state
其源码分析如下:
void
prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)
{
unsigned long flags;
wait->flags &= ~WQ_FLAG_EXCLUSIVE;
#需要注意的是操作spin lock保护的范围
spin_lock_irqsave(&q->lock, flags);
if (list_empty(&wait->task_list))
__add_wait_queue(q, wait);
set_current_state(state);
spin_unlock_irqrestore(&q->lock, flags);
}
与prepare_to_wait 类似的函数为prepare_to_wait_exclusive
void
prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state)
{
unsigned long flags;
wait->flags |= WQ_FLAG_EXCLUSIVE;
spin_lock_irqsave(&q->lock, flags);
if (list_empty(&wait->task_list))
__add_wait_queue_tail(q, wait);
set_current_state(state);
spin_unlock_irqrestore(&q->lock, flags);
}
这个函数会置位WQ_FLAG_EXCLUSIVE,如果wait->task_list 为null的话,就调用__add_wait_queue_tail
将wait_queue_t *wait 添加到wait_queue_head_t *q 的最后。