aboutsummaryrefslogtreecommitdiff
path: root/kernel/sched/sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched/sched.c')
-rw-r--r--kernel/sched/sched.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/kernel/sched/sched.c b/kernel/sched/sched.c
index bc3b30d..609c81b 100644
--- a/kernel/sched/sched.c
+++ b/kernel/sched/sched.c
@@ -14,8 +14,8 @@ static void init_idle() {
}
void sched_init() {
- init_kstack((char **) &kstack);
init_idle();
+ init_kstack((char **) &kstack);
schedule();
sei();
RESTORE_CONTEXT();
@@ -25,30 +25,30 @@ void sched_init() {
void schedule() {
if(!list_empty(&ready)) {
current = list_entry(ready.next, struct tcb_t, q);
- list_move_tail(&current->q, &ready);
+ list_move_tail(ready.next, &ready);
} else {
current = &idle;
}
}
+void wake_all(struct list_head* queue) {
+ list_splice_init(queue, ready.prev);
+ if (current == &idle) {
+ schedule();
+ }
+}
+
void spawn(struct tcb_t* const tcb, char args) {
tcb->sp = init_stack(tcb->mem_low, tcb->mem_high, tcb->entry, args);
INIT_LIST_HEAD(&tcb->q);
list_add_tail(&tcb->q, &ready);
}
-void yield() {
+void yield(void) {
+ cli();
SAVE_CONTEXT();
schedule();
RESTORE_CONTEXT();
+ sei();
RETURN();
-}
-
-void freeze() {
- SAVE_CONTEXT();
- list_del_init(&current->q);
- schedule();
- RESTORE_CONTEXT();
- asm volatile ( "ret" );
-}
-
+} \ No newline at end of file