1 #include <lunaix/ds/waitq.h>
2 #include <lunaix/process.h>
3 #include <lunaix/spike.h>
8 // prevent race condition.
9 cpu_disable_interrupt();
11 waitq_t* current_wq = &__current->waitqueue;
12 assert(llist_empty(¤t_wq->waiters));
14 llist_append(&queue->waiters, ¤t_wq->waiters);
19 cpu_enable_interrupt();
23 pwake_one(waitq_t* queue)
25 if (llist_empty(&queue->waiters)) {
29 waitq_t* wq = list_entry(queue->waiters.next, waitq_t, waiters);
30 struct proc_info* proc = container_of(wq, struct proc_info, waitqueue);
32 assert(proc->state == PS_BLOCKED);
33 proc->state = PS_READY;
34 llist_delete(&wq->waiters);
38 pwake_all(waitq_t* queue)
40 if (llist_empty(&queue->waiters)) {
44 struct proc_info* proc;
46 llist_for_each(pos, n, &queue->waiters, waiters)
48 proc = container_of(pos, struct proc_info, waitqueue);
50 assert(proc->state == PS_BLOCKED);
51 proc->state = PS_READY;
52 llist_delete(&pos->waiters);