#include <lunaix/ds/waitq.h>
#include <lunaix/process.h>
+#include <lunaix/sched.h>
#include <lunaix/spike.h>
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
}
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);
}
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