My Kernel v0.1.0
waitqueue.h
1
30#ifndef KERNEL_WAITQUEUE_H
31#define KERNEL_WAITQUEUE_H
32
33#include <kernel/process.h>
34#include <kernel/spinlock.h>
35
36#include <libalgo/queue.h>
37
39struct waitqueue {
40 spinlock_t lock; /*<! Synchronization lock */
41 queue_t queue; /*<! The queue of waiting threads */
42};
43
45#define __WAITQUEUE_INIT(_queue) \
46 { \
47 __INIT_SPINLOCK(.lock), .queue = __QUEUE_INIT(&(_queue).queue.head), \
48 }
49#define WAITQUEUE_INIT(_queue) ((struct waitqueue)__WAITQUEUE_INIT(_queue))
50
52#define __INIT_WAITQUEUE(_queue) _queue = __WAITQUEUE_INIT(_queue)
53#define INIT_WAITQUEUE(_queue) _queue = WAITQUEUE_INIT(_queue)
54
56#define DECLARE_WAITQUEUE(_queue) struct waitqueue INIT_WAITQUEUE(_queue)
57
59bool waitqueue_is_empty(struct waitqueue *);
60
68void waitqueue_enqueue_locked(struct waitqueue *, struct thread *);
69
71#define waitqueue_enqueue(waitqueue, thread) \
72 ({ \
73 spinlock_acquire(&(waitqueue)->lock); \
74 waitqueue_enqueue_locked(waitqueue, thread); \
75 })
76
78const struct thread *waitqueue_peek(struct waitqueue *);
79
83struct thread *waitqueue_dequeue(struct waitqueue *);
84
88size_t waitqueue_dequeue_all(struct waitqueue *);
89
90#endif /* KERNEL_WAITQUEUE_H */
91
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
Process management.
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