add_wait_queue 等待队列添加等待队列元素

//将队列元素加入到等待队列头部设置非互斥等待

void add_wait_queue(wait_queue_head_t *q,  

                                          wait_queue_t *wait)
{
    unsigned long flags;

    /*
          当一个等待队列入口有 WQ_FLAG_EXCLUSEVE 标志置位, 它被添加到等待队列的尾部. 没有这个标志的入口项, 相反, 添加              到开始
           当 wake_up 被在一个等待队列上调用, 它在唤醒第一个有 WQ_FLAG_EXCLUSIVE 标志的进程后停止
    */
    wait->flags &= ~WQ_FLAG_EXCLUSIVE;//设置为非互斥等待

    //保存本地中断状态 关闭中断 获取自旋锁
    spin_lock_irqsave(&q->lock, flags);
    
    __add_wait_queue(q, wait); //将等待项,加入到等待队列头部

    //回复本地中断状态 释放锁
    spin_unlock_irqrestore(&q->lock, flags);
}

q:等待队列

wait:等待队列元素

头文件: #include <linux/wait.h>

 

static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new)
{
    list_add(&new->task_list, &head->task_list);
}

 

 

//将等待元素加入到等待队列尾部  设置互斥等待

void add_wait_queue_exclusive(wait_queue_head_t *q,

                                                              wait_queue_t *wait)
{
    unsigned long flags;

    wait->flags |= WQ_FLAG_EXCLUSIVE;//设置为互斥等待
    
    //保存本地中断状态 关闭中断 获取自旋锁
    spin_lock_irqsave(&q->lock, flags);

    //添加到队列尾部
    __add_wait_queue_tail(q, wait);

    //回复本地中断状态 释放锁
    spin_unlock_irqrestore(&q->lock, flags);
}

q:等待队列

wait:等待队列元素

头文件: #include <linux/wait.h>

static inline void __add_wait_queue_tail(wait_queue_head_t *head,
                        wait_queue_t *new)
{
    list_add_tail(&new->task_list, &head->task_list);
}

例子如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值