__WAITQUEUE_DEBUG_INIT(name)} 通过DECLARE_WAITQUEUE宏将等待队列项初始化成对应的任务结构,并且用于连接的相关指针均设置为空。其中加入了调试相关代码。 #define DECLARE_WAIT_QUEUE_HEAD(name) \ wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name) #define __WAIT_QUEUE_HEAD_INITIALIZER(name...
1. 定义并初始化等待队列头 wait_queue_head struct wait_queue_head { //include/linux/wait.h spinlock_t lock; struct list_head head; }; typedef struct wait_queue_head wait_queue_head_t; //示例: static wait_queue_head_t wait_head; init_waitqueue_head(&wait_head); //初始化 wait_head...
可以通过调用init_waitqueue_head()函数来初始化wait_queue_head_t结构,其实现如下: void init_waitqueue_head(wait_queue_head_t *q) { spin_lock_init(&q->lock); INIT_LIST_HEAD(&q->task_list); } 初始化过程很简单,首先调用spin_lock_init()来初始化自旋锁lock,然后调用INIT_LIST_HEAD()来初始...
1 __init_waitqueue_head(&my_queue):进行等待队列的初始化。 2 DECLARE_WAITQUEUE: 定义等待队列元素。代码如下 #define __WAITQUEUE_INITIALIZER(name, tsk) { \ .private = tsk, \ .func = default_wake_function, \ .task_list = { NULL, NULL } } } #define DECLARE_WAITQUEUE(name, tsk) \ ...
//1.静态方式DECLARE_WAIT_QUEUE_HEAD(wq); // 2. 动态方式wait_queue_head_twq;init_waitqueue_head (&wq); 2.2 — 任务入队 加入Waitqueue中的任务都会进入睡眠状态。根据入队方式的不同,队中任务有不同的唤醒行为: 1 wait_event ...
wait_queue_head_t my_queue;init_waitqueue_head(&my_queue); 直接定义并初始化。init_waitqueue_head()函数会将自旋锁初始化为未锁,等待队列初始化为空的双向循环链表。 (2) DECLARE_WAIT_QUEUE_HEAD(my_queue); 定义并初始化,相当于(1)。
2. 静态初始化DEFINE_WAIT() 1. #define DEFINE_WAIT_FUNC(name, function) \ 2. wait_queue_t name = { \ 3. private 4. .func = function, \ 5. .task_list = LIST_HEAD_INIT((name).task_list), \ 6. } 7. 8. #define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, autoremove_wake_func...
voidinit_waitqueue_head(wait_queue_head_t*q){spin_lock_init(&q->lock);INIT_LIST_HEAD(&q->task_list);} 初始化过程很简单,首先调用spin_lock_init()来初始化自旋锁lock,然后调用INIT_LIST_HEAD()来初始化进程链表。 向等待队列添加等待进程 ...
wait_queue_head_t wq; 2.初始化等待队列头 init_waitqueue_head(&wq); //宏名用于定义并初始化,相当于"快捷方式" DECLARE_WAIT_QUEUE_HEAD (my_queue); /*定义并初始化一个名为name的等待队列 ,注意此处是定义一个wait_queue_t类型的变量name,并将其private设置为tsk*/ ...
void __init_waitqueue_head(wait_queue_head_t *q, struct lock_class_key *key) { spin_lock_init(&q->lock); lockdep_set_class(&q->lock, key); INIT_LIST_HEAD(&q->task_list); } 从上面的定义可知,实质上等待队列头很简单,只要就是一个链表头,而等待队列的节点主要包含了一个函数指针和对...