X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/ea77b9c3fc7fb9bf9d7f9604fc187c8049212a2a..313093773e81eb89ad3c44b048a79bbcd6e94099:/lunaix-os/kernel/ds/waitq.c diff --git a/lunaix-os/kernel/ds/waitq.c b/lunaix-os/kernel/ds/waitq.c index 5241a4e..7045e36 100644 --- a/lunaix-os/kernel/ds/waitq.c +++ b/lunaix-os/kernel/ds/waitq.c @@ -1,19 +1,22 @@ #include #include -#include #include void pwait(waitq_t* queue) { + // prevent race condition. + cpu_disable_interrupt(); + waitq_t* current_wq = &__current->waitqueue; assert(llist_empty(¤t_wq->waiters)); llist_append(&queue->waiters, ¤t_wq->waiters); - // FIXME centralize the state change. - __current->state = PS_BLOCKED; + block_current(); sched_yieldk(); + + cpu_enable_interrupt(); } void @@ -44,6 +47,7 @@ pwake_all(waitq_t* queue) { proc = container_of(pos, struct proc_info, waitqueue); + assert(proc->state == PS_BLOCKED); proc->state = PS_READY; llist_delete(&pos->waiters); }