1、static DECLARE_WAIT_QUEUE_HEAD(button_waitq);
DECLARE_WAIT_QUEUE_HEAD是一个宏,定义如下:
#define DECLARE_WAIT_QUEUE_HEAD(name) \
wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
wait_queue_head_t也是一个宏,定义如下:
typedef struct __wait_queue_head wait_queue_head_t;
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
__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 } }
所以,static DECLARE_WAIT_QUEUE_HEAD(button_waitq);相当于定义了一个名为button_waitq
struct __wait_queue_head类型的结构体变量,并初始化为:
.lock = __SPIN_LOCK_UNLOCKED(name.lock),
.task_list = { &(name).task_list, &(name).task_list }
意义:定义一个名为button_waitq的队列头,代表该进程。
2、wait_event_interruptible(button_waitq, ev_press);
#define wait_event_interruptible(wq, condition) \
({ \
int __ret = 0; \
if (!(condition)) \
__wait_event_interruptible(wq, condition, __ret); \
__ret; \
})
当条件condition为0是调用__wait_event_interruptible(wq, condition, __ret)进行休眠;
3、wake_up_interruptible(&button_waitq);
#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);
}
唤醒button_waitq队列头代表的进程。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。