Skip to content

Locked list

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);