0
点赞
收藏
分享

微信扫一扫

DECLARE_WAIT_QUEUE_HEAD、wake_up_interruptible宏分析

思考的鸿毛 2022-02-12 阅读 58

DECLARE_WAIT_QUEUE_HEAD

//源码
struct list_head {
	struct list_head *next, *prev;
};

struct __wait_queue_head {
    spinlock_t lock;
    struct list_head task_list;
};

typedef struct __wait_queue_head wait_queue_head_t;

#define DECLARE_WAIT_QUEUE_HEAD (name) 
        wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)

#define __WAIT_QUEUE_HEAD_INITIALIZER (name) {                    
    .lock       = __SPIN_LOCK_UNLOCKED(name.lock),               
    .task_list = { &(name).task_list, &(name).task_list } 
}

//DECLARE_WAIT_QUEUE_HEAD(wq);解开宏定义语句结果如下
wait_queue_head_t wq = {                    
    .lock       = __SPIN_LOCK_UNLOCKED(wq.lock),               
    .task_list = { &(wq).task_list, &(wq).task_list } 
}

#include <linux/wait.h>
//以下两行等价于DECLARE_WAIT_QUEUE_HEAD(wq);
wait_queue_head_t wq;
init_waitqueue_head(&wq);   

wake_up_interruptible

#define wake_up_interruptible(x)	__wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)
 
 
void __wake_up(wait_queue_head_t *q, unsigned int mode,
			int nr_exclusive, void *key)
{
	unsigned long flags;
 
	spin_lock_irqsave(&q->lock, flags);
	__wake_up_common(q, mode, nr_exclusive, 0, key);
	spin_unlock_irqrestore(&q->lock, flags);
}
举报
0 条评论