Kernel: More rework on Scheduler

This commit is contained in:
Bananymous 2023-03-08 03:23:46 +02:00
parent e7a577f54a
commit 1dabe7a222
2 changed files with 17 additions and 14 deletions

View File

@ -28,18 +28,21 @@ namespace Kernel
void wake_threads(); void wake_threads();
[[nodiscard]] bool save_current_thread(); [[nodiscard]] bool save_current_thread();
void get_next_thread(); void remove_and_advance_current_thread();
void advance_current_thread();
[[noreturn]] void execute_current_thread(); [[noreturn]] void execute_current_thread();
private: private:
struct ActiveThread struct ActiveThread
{ {
ActiveThread(const BAN::RefPtr<Thread>& thread) : thread(thread) {}
BAN::RefPtr<Thread> thread; BAN::RefPtr<Thread> thread;
uint64_t padding = 0; uint64_t padding = 0;
}; };
struct SleepingThread struct SleepingThread
{ {
SleepingThread(const BAN::RefPtr<Thread>& thread, uint64_t wake_time) : thread(thread), wake_time(wake_time) {}
BAN::RefPtr<Thread> thread; BAN::RefPtr<Thread> thread;
uint64_t wake_time; uint64_t wake_time;
}; };

View File

@ -53,6 +53,7 @@ namespace Kernel
void Scheduler::reschedule() void Scheduler::reschedule()
{ {
VERIFY_CLI();
ASSERT(InterruptController::get().is_in_service(PIT_IRQ)); ASSERT(InterruptController::get().is_in_service(PIT_IRQ));
InterruptController::get().eoi(PIT_IRQ); InterruptController::get().eoi(PIT_IRQ);
@ -81,23 +82,17 @@ namespace Kernel
// This should work as we released enough memory from sleeping thread // This should work as we released enough memory from sleeping thread
static_assert(sizeof(ActiveThread) == sizeof(SleepingThread)); static_assert(sizeof(ActiveThread) == sizeof(SleepingThread));
MUST(m_active_threads.push_back({ thread, 0 })); MUST(m_active_threads.emplace_back(thread));
thread.clear();
} }
} }
BAN::ErrorOr<void> Scheduler::add_thread(BAN::RefCounted<Thread> thread) BAN::ErrorOr<void> Scheduler::add_thread(BAN::RefPtr<Thread> thread)
{ {
if (interrupts_disabled()) auto flags = disable_interrupts_and_get_flags();
{ BAN::ErrorOr<void> result = m_active_threads.emplace_back(thread);
TRY(m_active_threads.push_back({ thread, 0 })); restore_flags(flags);
} return result;
else
{
DISABLE_INTERRUPTS();
TRY(m_active_threads.push_back({ thread, 0 }));
ENABLE_INTERRUPTS();
}
return {};
} }
void Scheduler::advance_current_thread() void Scheduler::advance_current_thread()
@ -176,6 +171,7 @@ namespace Kernel
#pragma GCC optimize("O0") #pragma GCC optimize("O0")
void Scheduler::set_current_thread_sleeping(uint64_t wake_time) void Scheduler::set_current_thread_sleeping(uint64_t wake_time)
{ {
VERIFY_STI();
DISABLE_INTERRUPTS(); DISABLE_INTERRUPTS();
ASSERT(m_current_thread); ASSERT(m_current_thread);
@ -183,7 +179,10 @@ namespace Kernel
auto sleeping = m_current_thread->thread; auto sleeping = m_current_thread->thread;
if (save_current_thread()) if (save_current_thread())
{
ENABLE_INTERRUPTS();
return; return;
}
remove_and_advance_current_thread(); remove_and_advance_current_thread();
auto it = m_sleeping_threads.begin(); auto it = m_sleeping_threads.begin();
@ -203,6 +202,7 @@ namespace Kernel
void Scheduler::set_current_thread_done() void Scheduler::set_current_thread_done()
{ {
VERIFY_STI();
DISABLE_INTERRUPTS(); DISABLE_INTERRUPTS();
ASSERT(m_current_thread); ASSERT(m_current_thread);