include/structures/locked_list.h View source View on GitHub
struct locked_list {
struct list_head list;
struct spinlock lock;
size_t num_elems : 63;
bool lock_irq_disable : 1;
};
enum irql locked_list_lock(struct locked_list *ll);
void locked_list_unlock(struct locked_list *ll, enum irql irql);
bool locked_list_empty(struct locked_list *ll);
void locked_list_add(struct locked_list *ll, struct list_head *lh);
void locked_list_del(struct locked_list *ll, struct list_head *lh);
void locked_list_del_locked(struct locked_list *ll, struct list_head *lh);
struct list_head locked_list_pop_front(struct locked_list *ll);
size_t locked_list_num_elems(struct locked_list *ll);
void locked_list_init(struct locked_list *ll, bool irq_disable);
#define LOCKED_LIST_INIT(ll, irq_disable) \
(struct locked_list) { \
.list = LIST_HEAD_INIT(ll.list), .lock = SPINLOCK_INIT, \
.num_elems = ATOMIC_VAR_INIT(0), .lock_irq_disable = irq_disable \
}
#define LOCKED_LIST_DEFINE(name, irq_disable) \
struct locked_list name = LOCKED_LIST_INIT(name, irq_disable)
#define LOCKED_LIST_INIT_IRQ_DISABLE true
#define LOCKED_LIST_INIT_NORMAL false
#define LOCKED_LIST_DO(ll, action) \
enum irql __macro_irql = locked_list_lock(ll); \
action; \
locked_list_unlock(ll, __macro_irql);