进程调度API之prepare_to_wait/prepare_to_wait_exclusive
2017-12-14 09:14
567 查看
void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)用于将wait queue 加入到wait queue head 这个队列中,并设置当前thread的状态为state。与此具有有相同功能的函数是add_wait_queue。区别在于 调用prepare_to_wait 在将wait_queue_t *wait加入到wait_queue_head_t *q中时,会判断wait_queue_t *wait 中 是否包含要唤醒的进程. 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_irqsave(&q->lock, flags); //判断当前wait->task_list 为null,如果为null,说明没有进程需要唤醒,也就没有 //必要添加到wait_queue_head_t *q, if (list_empty(&wait->task_list)) __add_wait_queue(q, wait); set_current_state(state); spin_unlock_irqrestore(&q->lock, flags); } 这个函数会清除WQ_FLAG_EXCLUSIVE 。如果不需要清除WQ_FLAG_EXCLUSIVE的话,可以调用prepare_to_wait_exclusive 相比add_wait_queue,prepare_to_wait 多了一层判断wait->task_list 是否为null,应优先使用这个函数 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_queue_t *wait 添加到ait_queue_head_t *q的最后.
相关文章推荐
- 进程调度API之prepare_to_wait
- 进程调度API之add_wait_queue_exclusive
- 进程调度API之finish_wait
- 进程调度API之add_wait_queue/remove_wait_queue
- 进程调度API之wait_for_completion_x
- 进程调度API之preempt_schedule
- 进程调度API之completion_done
- 进程调度API之preempt_count_dec_and_test
- 对jiq中一段程序以及prepare_to_wait的理解
- 进程调度API之autoremove_wake_function
- 进程调度API之set_cpus_allowed_ptr
- 进程调度API之wake_up_process
- 进程调度API之init_waitqueue_head
- 进程调度API之complete
- 进程调度API之__wake_up_sync
- 进程调度API之task_nice
- Robotium中文API(23)-solo.waitForDialogToOpen
- 进程调度API之complete_all
- 进程调度API之set_user_nice
- 进程调度API之preempt_notifier_register/preempt_notifier_unregister