1 #include <lunaix/ds/waitq.h>
2 #include <lunaix/process.h>
3 #include <lunaix/sched.h>
4 #include <lunaix/spike.h>
9 assert(current_thread);
10 // prevent race condition.
11 cpu_disable_interrupt();
13 waitq_t* current_wq = ¤t_thread->waitqueue;
14 assert(llist_empty(¤t_wq->waiters));
16 llist_append(&queue->waiters, ¤t_wq->waiters);
18 block_current_thread();
21 cpu_enable_interrupt();
25 pwake_one(waitq_t* queue)
27 if (llist_empty(&queue->waiters)) {
31 waitq_t* wq = list_entry(queue->waiters.next, waitq_t, waiters);
32 struct thread* thread = container_of(wq, struct thread, waitqueue);
34 assert(thread->state == PS_BLOCKED);
35 thread->state = PS_READY;
36 llist_delete(&wq->waiters);
40 pwake_all(waitq_t* queue)
42 if (llist_empty(&queue->waiters)) {
46 struct thread* thread;
48 llist_for_each(pos, n, &queue->waiters, waiters)
50 thread = container_of(pos, struct thread, waitqueue);
52 assert(thread->state == PS_BLOCKED);
53 thread->state = PS_READY;
54 llist_delete(&pos->waiters);