进程调度API之prepare_to_wait

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 的最后。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值