summaryrefslogtreecommitdiff
path: root/src/kernel/proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/proc.c')
-rw-r--r--src/kernel/proc.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/kernel/proc.c b/src/kernel/proc.c
index 175377e..bb4509b 100644
--- a/src/kernel/proc.c
+++ b/src/kernel/proc.c
@@ -84,8 +84,7 @@ void process_free(struct process *p) {
kfree(p);
}
-// TODO make process_switch private
-void process_switch(struct process *proc) {
+static _Noreturn void process_switch(struct process *proc) {
assert(proc->state == PS_RUNNING);
if (proc->deathbed) {
process_kill(proc, -1);
@@ -96,13 +95,8 @@ void process_switch(struct process *proc) {
sysexit(proc->regs);
}
-_Noreturn void process_switch_any(void) {
- struct process *found = process_find(PS_RUNNING);
- if (found) process_switch(found);
- process_idle();
-}
-
-_Noreturn void process_idle(void) {
+/** If there are any processes waiting for IRQs, wait with them. Otherwise, shut down */
+static _Noreturn void process_idle(void) {
struct process *procs[16];
size_t len = process_find_multiple(PS_WAITS4IRQ, procs, 16);
@@ -121,6 +115,15 @@ _Noreturn void process_idle(void) {
}
}
+_Noreturn void process_switch_any(void) {
+ if (process_current && process_current->state == PS_RUNNING)
+ process_switch(process_current);
+
+ struct process *found = process_find(PS_RUNNING);
+ if (found) process_switch(found);
+ process_idle();
+}
+
struct process *process_next(struct process *p) {
/* is a weird depth-first search, the search order is:
* 1