30#ifndef KERNEL_WAITQUEUE_H
31#define KERNEL_WAITQUEUE_H
34#include <kernel/spinlock.h>
45#define __WAITQUEUE_INIT(_queue) \
47 __INIT_SPINLOCK(.lock), .queue = __QUEUE_INIT(&(_queue).queue.head), \
49#define WAITQUEUE_INIT(_queue) ((struct waitqueue)__WAITQUEUE_INIT(_queue))
52#define __INIT_WAITQUEUE(_queue) _queue = __WAITQUEUE_INIT(_queue)
53#define INIT_WAITQUEUE(_queue) _queue = WAITQUEUE_INIT(_queue)
56#define DECLARE_WAITQUEUE(_queue) struct waitqueue INIT_WAITQUEUE(_queue)
71#define waitqueue_enqueue(waitqueue, thread) \
73 spinlock_acquire(&(waitqueue)->lock); \
74 waitqueue_enqueue_locked(waitqueue, thread); \
void waitqueue_enqueue_locked(struct waitqueue *, struct thread *)
Mark a thread as waiting for the event to finish.
Definition: waitqueue.c:16
struct thread * waitqueue_dequeue(struct waitqueue *)
Wakeup the first thread inside the queue.
Definition: waitqueue.c:51
const struct thread * waitqueue_peek(struct waitqueue *)
Definition: waitqueue.c:36
size_t waitqueue_dequeue_all(struct waitqueue *)
Wakeup all the threads inside the queue.
Definition: waitqueue.c:69
bool waitqueue_is_empty(struct waitqueue *)
Check whether anyone is waiting for this event to finish.
Definition: waitqueue.c:6
The head of a doubly linked list.
Definition: linked_list.h:43
Spinlock.
Definition: spinlock.h:29
A single thread.
Definition: process.h:121
Waiting Queue.
Definition: waitqueue.h:39