diff options
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 |