diff options
author | Jakob Odersky <jodersky@gmail.com> | 2014-01-25 01:22:40 +0100 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2014-01-25 01:22:40 +0100 |
commit | 06c4f980e915c2ec6c685ca2ba8781b9af547239 (patch) | |
tree | 94634dc4798809e0fa6180ed44e655afcab5b1a3 /kernel/sched/sched.c | |
parent | 9a10159e96a13585f9040ac5b15a3520f3d93ec8 (diff) | |
download | mux-06c4f980e915c2ec6c685ca2ba8781b9af547239.tar.gz mux-06c4f980e915c2ec6c685ca2ba8781b9af547239.tar.bz2 mux-06c4f980e915c2ec6c685ca2ba8781b9af547239.zip |
fix freezing
Diffstat (limited to 'kernel/sched/sched.c')
-rw-r--r-- | kernel/sched/sched.c | 26 |
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(¤t->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(¤t->q); - schedule(); - RESTORE_CONTEXT(); - asm volatile ( "ret" ); -} - +}
\ No newline at end of file |