Few small adjustments to the scheduler

This commit is contained in:
apio 2022-09-20 20:02:08 +02:00
parent 1c12cf016e
commit ddbe9b8b8b

View File

@ -1,6 +1,7 @@
#define MODULE "sched"
#include "thread/Scheduler.h"
#include "assert.h"
#include "interrupts/Interrupts.h"
#include "log/Log.h"
#include "memory/KernelMemoryManager.h"
@ -45,7 +46,7 @@ void Scheduler::init()
end_task = base_task;
sched_current_task = base_task;
sched_current_task->id = free_tid++;
sched_current_task->task_time = 30; // gets 30 ms of cpu time before next switch
sched_current_task->task_time = 20; // gets 20 ms of cpu time before next switch
sched_current_task->next_task = nullptr;
// the other registers will be saved next task switch
@ -63,7 +64,7 @@ void Scheduler::add_kernel_task(void (*task)(void))
new_task->regs.cs = 0x08;
new_task->regs.ds = 0x10;
asm volatile("pushfq; movq (%%rsp), %%rax; movq %%rax, %0; popfq;" : "=m"(new_task->regs.rflags)::"%rax");
new_task->regs.rflags |= 0x200;
new_task->regs.rflags |= 0x200; // enable interrupts
new_task->task_sleep = 0;
new_task->task_time = 0;
end_task->next_task = new_task;
@ -88,6 +89,7 @@ static void sched_decrement_sleep_times()
void Scheduler::task_tick(Context* context)
{
ASSERT(Interrupts::is_in_handler());
sched_decrement_sleep_times();
sched_current_task->task_time -= frequency;
if (sched_current_task->task_time < 0)
@ -99,6 +101,7 @@ void Scheduler::task_tick(Context* context)
void Scheduler::task_yield(Context* context)
{
ASSERT(Interrupts::is_in_handler());
get_context_to_task(*sched_current_task, context);
bool was_idle = false;
if (sched_current_task->id == 0) // idle task
@ -112,7 +115,7 @@ void Scheduler::task_yield(Context* context)
if (!sched_current_task) { sched_current_task = base_task; }
if (sched_current_task->task_sleep == 0)
{
sched_current_task->task_time = 30;
sched_current_task->task_time = 20;
set_context_from_task(*sched_current_task, context);
return;
}
@ -123,8 +126,7 @@ void Scheduler::task_yield(Context* context)
if (!was_idle) { set_context_from_task(*sched_current_task, context); }
return;
}
kinfoln("Resuming current task %ld", original_task->id);
original_task->task_time = 30; // grant 30 more ms, there is no other task available
original_task->task_time = 20; // grant 30 more ms, there is no other task available
return;
}