您的位置:首页 > 大数据 > 人工智能

进程调度API之prepare_to_wait/prepare_to_wait_exclusive

2017-12-14 09:14 567 查看
void  prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)用于将wait queue
加入到wait queue head 这个队列中,并设置当前thread的状态为state。与此具有有相同功能的函数是add_wait_queue。区别在于
调用prepare_to_wait 在将wait_queue_t *wait加入到wait_queue_head_t *q中时,会判断wait_queue_t *wait 中
是否包含要唤醒的进程.
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_irqsave(&q->lock, flags);
//判断当前wait->task_list 为null,如果为null,说明没有进程需要唤醒,也就没有
//必要添加到wait_queue_head_t *q,
if (list_empty(&wait->task_list))
__add_wait_queue(q, wait);

set_current_state(state);
spin_unlock_irqrestore(&q->lock, flags);
}
这个函数会清除WQ_FLAG_EXCLUSIVE 。如果不需要清除WQ_FLAG_EXCLUSIVE的话,可以调用prepare_to_wait_exclusive
相比add_wait_queue,prepare_to_wait 多了一层判断wait->task_list 是否为null,应优先使用这个函数
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_queue_t *wait 添加到ait_queue_head_t *q的最后.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: