summaryrefslogtreecommitdiff
path: root/kernel/scheduler.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-28 11:13:06 +0200
committerMiguel <m.i@gmx.at>2018-09-28 11:13:06 +0200
commit5f6c2bcf0d2f9c416134aba224d90a605f216818 (patch)
tree6fda812ecd1ce06f743c292f3d0495d0b2941bbd /kernel/scheduler.c
parent4ddca59e2c07a98988ffb07571d2b35c4c90f5ac (diff)
struggling with scheduler and userprog to view ppm files
Diffstat (limited to 'kernel/scheduler.c')
-rw-r--r--kernel/scheduler.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 0c24f94..23ed7b2 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -120,8 +120,10 @@ static uint32_t scheduler_schedule(uint32_t idx)
if(task_list[cpu][idx].active && !task_list[cpu][idx].syscall)
{
if(current_task[cpu]!=0)last_task[cpu]=current_task[cpu];
-
current_task[cpu]=idx;
+
+ // klog("%d idx %d",last_task[cpu],current_task[cpu]);
+
install_tss(cpu,task_list[cpu][idx].esp0);
x86_set_page_directory(task_list[cpu][idx].vmem);
return task_list[cpu][idx].esp;
@@ -153,19 +155,36 @@ volatile uint32_t scheduler_run(uint32_t oldesp,uint32_t preference)
else task_list[cpu][current_task[cpu]].esp=oldesp;
uint32_t esp;
- esp=scheduler_schedule(preference); // try preference
- if(esp)return esp;
+ if(preference!=-1)
+ {
+ esp=scheduler_schedule(preference); // try preference
+ if(esp)return esp;
+
+ if(current_task[cpu]==0)// we have interrupted a task with ring1 work
+ {
+ esp=scheduler_schedule(last_task[cpu]); // try preference
+ if(esp)return esp;
+ }
+ }
+ else
+ {
+ //klog("preempt %d", last_task[cpu]);
+ }
for(int i=0;i<MAX_TASKS;i++)
{
int idx=(last_task[cpu]+1+i)%MAX_TASKS; // schedule round robin style
+ if(preference==-1&&idx==0)continue;
if(idx==preference||idx==2)continue;// skip sleeper and preferred tasks here.
esp=scheduler_schedule(idx);
- if(esp)return esp;
+ if(esp){
+ //klog("%d",idx);
+ return esp;
+ }
}
// force the sleeper task...
@@ -349,9 +368,10 @@ void task_syscall_worker()
task_list[cpu][0].syscall=true; // sleep (syscall misused)
}
x86_sti();
+
if(nowork)
{
- __asm__("int $0x81"); // wake scheduler!
+ __asm__("int $0x81"); // wake scheduler! with IPI
}
}
}