wait.h
来自「xen 3.2.2 源码」· C头文件 代码 · 共 115 行
H
115 行
#ifndef __WAIT_H__#define __WAIT_H__#include <sched.h>#include <list.h>#include <lib.h>#include <os.h>struct wait_queue{ struct thread *thread; struct list_head thread_list;};struct wait_queue_head{ /* TODO - lock required? */ struct list_head thread_list;};#define DECLARE_WAIT_QUEUE_HEAD(name) \ struct wait_queue_head name = \ { .thread_list = { &(name).thread_list, &(name).thread_list} }#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \ .thread_list = { &(name).thread_list, &(name).thread_list } }#define DEFINE_WAIT(name) \struct wait_queue name = { \ .thread = current, \ .thread_list = LIST_HEAD_INIT((name).thread_list), \}static inline void init_waitqueue_head(struct wait_queue_head *h){ INIT_LIST_HEAD(&h->thread_list);}static inline void init_waitqueue_entry(struct wait_queue *q, struct thread *thread){ q->thread = thread; INIT_LIST_HEAD(&q->thread_list);}static inline void add_wait_queue(struct wait_queue_head *h, struct wait_queue *q){ if (list_empty(&q->thread_list)) list_add(&q->thread_list, &h->thread_list); }static inline void remove_wait_queue(struct wait_queue *q){ list_del(&q->thread_list);}static inline void wake_up(struct wait_queue_head *head){ unsigned long flags; struct list_head *tmp, *next; local_irq_save(flags); list_for_each_safe(tmp, next, &head->thread_list) { struct wait_queue *curr; curr = list_entry(tmp, struct wait_queue, thread_list); wake(curr->thread); } local_irq_restore(flags);}#define add_waiter(w, wq) do { \ unsigned long flags; \ local_irq_save(flags); \ add_wait_queue(&wq, &w); \ block(current); \ local_irq_restore(flags); \} while (0)#define remove_waiter(w) do { \ unsigned long flags; \ local_irq_save(flags); \ remove_wait_queue(&w); \ local_irq_restore(flags); \} while (0)#define wait_event(wq, condition) do{ \ unsigned long flags; \ if(condition) \ break; \ DEFINE_WAIT(__wait); \ for(;;) \ { \ /* protect the list */ \ local_irq_save(flags); \ add_wait_queue(&wq, &__wait); \ block(current); \ local_irq_restore(flags); \ if(condition) \ break; \ schedule(); \ } \ local_irq_save(flags); \ /* need to wake up */ \ wake(current); \ remove_wait_queue(&__wait); \ local_irq_restore(flags); \} while(0) #endif /* __WAIT_H__ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?