1 #include <lunaix/ds/waitq.h>
2 #include <lunaix/process.h>
3 #include <lunaix/sched.h>
4 #include <lunaix/spike.h>
9 waitq_t* current_wq = &__current->waitqueue;
10 assert(llist_empty(¤t_wq->waiters));
12 llist_append(&queue->waiters, ¤t_wq->waiters);
14 // FIXME centralize the state change.
15 __current->state = PS_BLOCKED;
20 pwake_one(waitq_t* queue)
22 if (llist_empty(&queue->waiters)) {
26 waitq_t* wq = list_entry(queue->waiters.next, waitq_t, waiters);
27 struct proc_info* proc = container_of(wq, struct proc_info, waitqueue);
29 assert(proc->state == PS_BLOCKED);
30 proc->state = PS_READY;
31 llist_delete(&wq->waiters);
35 pwake_all(waitq_t* queue)
37 if (llist_empty(&queue->waiters)) {
41 struct proc_info* proc;
43 llist_for_each(pos, n, &queue->waiters, waiters)
45 proc = container_of(pos, struct proc_info, waitqueue);
47 proc->state = PS_READY;
48 llist_delete(&pos->waiters);