include/sync/turnstile.h View source View on GitHub
struct turnstile {
struct thread *owner;
bool applied_pi_boost;
enum thread_prio_class prio_class;
struct list_head hash_list;
struct list_head freelist;
size_t waiters;
void *lock_obj;
struct rbt queues[TURNSTILE_NUM_QUEUES];
enum turnstile_state state;
};
struct turnstile_hash_chain {
struct list_head list;
struct spinlock lock;
};
struct turnstile_hash_table {
struct turnstile_hash_chain heads[TURNSTILE_HASH_SIZE];
};
enum turnstile_state {
TURNSTILE_STATE_UNUSED,
TURNSTILE_STATE_IN_HASH_TABLE,
TURNSTILE_STATE_IN_FREE_LIST,
};
void turnstiles_init();
struct turnstile * turnstile_create(void);
void turnstile_destroy(struct turnstile *ts);
struct turnstile * turnstile_init(struct turnstile *ts);
struct turnstile * turnstile_block(struct turnstile *ts, size_t queue_num, void *lock_obj, enum irql lock_irql, struct thread *owner);
struct turnstile * turnstile_lookup(void *obj, enum irql *irql_out);
void turnstile_unlock(void *obj, enum irql irql);
void turnstile_wake(struct turnstile *ts, size_t queue, size_t num_threads, enum irql lock_irql);
size_t turnstile_get_waiter_count(void *lock_obj);
int32_t turnstile_thread_priority(struct thread *t);
#define TURNSTILE_WRITER_QUEUE 0
#define TURNSTILE_READER_QUEUE 1
#define TURNSTILE_NUM_QUEUES 2
#define turnstile_from_freelist(fl) \
(container_of(fl, struct turnstile, freelist))
#define turnstile_from_hash_list_node(hln) \
(container_of(hln, struct turnstile, hash_list))
#define TURNSTILE_HASH_SIZE 128
#define TURNSTILE_HASH_MASK (TURNSTILE_HASH_SIZE - 1)
#define TURNSTILE_OBJECT_HASH(obj) \
((((uintptr_t) (obj) >> 3) * 2654435761u) & TURNSTILE_HASH_MASK)
#define TURNSTILE_CHAIN(sobj) global.turnstiles[TURNSTILE_OBJECT_HASH(sobj)]