summaryrefslogtreecommitdiff
path: root/kernel/sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 529db61..9f955d2 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -199,12 +199,25 @@ void reschedule(void) {
n = ctaskn;
while(1) {
- n = (n + 1) % NRTASKS;
- if(tasks[n].pid && tasks[n].state == TSTATE_RUNNING)
- break;
- }
+ /* check alarms and signals */
+ for(i = 0; i < NRTASKS; i++) {
+ if(tasks[i].alarm && tasks[i].alarm < ticks) {
+ tasks[i].alarm = 0;
+ tasks[i].signal |= 1 << (SIGALRM - 1);
+ }
+ if(tasks[i].signal && tasks[i].state == TSTATE_INTERRUPTIBLE)
+ tasks[i].state = TSTATE_RUNNING;
+ }
- switch_to(n, &tasks[n]);
+ /* check if a process is ready to run */
+ for(i = 0; i < NRTASKS; i++) {
+ n = (n + 1) % NRTASKS;
+ if(tasks[n].pid && tasks[n].state == TSTATE_RUNNING) {
+ switch_to(n, &tasks[n]);
+ return;
+ }
+ }
+ }
}
void sched_tick(void) {