X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/ea77b9c3fc7fb9bf9d7f9604fc187c8049212a2a..6c506d8916fb114675e93d0e2cb20831d4022294:/lunaix-os/kernel/ds/waitq.c diff --git a/lunaix-os/kernel/ds/waitq.c b/lunaix-os/kernel/ds/waitq.c index 5241a4e..522974f 100644 --- a/lunaix-os/kernel/ds/waitq.c +++ b/lunaix-os/kernel/ds/waitq.c @@ -6,14 +6,21 @@ void pwait(waitq_t* queue) { - waitq_t* current_wq = &__current->waitqueue; + assert(current_thread); + // prevent race condition. + cpu_disable_interrupt(); + + waitq_t* current_wq = ¤t_thread->waitqueue; assert(llist_empty(¤t_wq->waiters)); llist_append(&queue->waiters, ¤t_wq->waiters); - // FIXME centralize the state change. - __current->state = PS_BLOCKED; - sched_yieldk(); + block_current_thread(); + sched_pass(); + + // In case of SIGINT-forced awaken + llist_delete(¤t_wq->waiters); + cpu_enable_interrupt(); } void @@ -24,10 +31,10 @@ pwake_one(waitq_t* queue) } waitq_t* wq = list_entry(queue->waiters.next, waitq_t, waiters); - struct proc_info* proc = container_of(wq, struct proc_info, waitqueue); + struct thread* thread = container_of(wq, struct thread, waitqueue); - assert(proc->state == PS_BLOCKED); - proc->state = PS_READY; + assert(thread->state == PS_BLOCKED); + thread->state = PS_READY; llist_delete(&wq->waiters); } @@ -38,13 +45,14 @@ pwake_all(waitq_t* queue) return; } - struct proc_info* proc; + struct thread* thread; waitq_t *pos, *n; llist_for_each(pos, n, &queue->waiters, waiters) { - proc = container_of(pos, struct proc_info, waitqueue); + thread = container_of(pos, struct thread, waitqueue); - proc->state = PS_READY; + assert(thread->state == PS_BLOCKED); + thread->state = PS_READY; llist_delete(&pos->waiters); } } \ No newline at end of file