diff --git a/src/kernel/service/SchedulerService.cpp b/src/kernel/service/SchedulerService.cpp index c391ddb..92510aa 100644 --- a/src/kernel/service/SchedulerService.cpp +++ b/src/kernel/service/SchedulerService.cpp @@ -1 +1,37 @@ #include "SchedulerService.h" + +namespace Kernel { + +void SchedulerService::startScheduling() { + scheduler.start(scheduler.ready_queue.begin()); +} + +uint16_t SchedulerService::active() const { + return scheduler.get_active(); +} + +void SchedulerService::yield() { + scheduler.yield(); +} + +void SchedulerService::block() { + scheduler.block(); +} + +void SchedulerService::deblock(uint16_t tid) { + scheduler.deblock(tid); +} + +void SchedulerService::exit() { + scheduler.exit(); +} + +void SchedulerService::suicide(uint16_t tid) { + scheduler.nice_kill(tid); +} + +void SchedulerService::kill(uint16_t tid) { + scheduler.kill(tid); +} + +} diff --git a/src/kernel/service/SchedulerService.h b/src/kernel/service/SchedulerService.h index 86a9e43..03f0538 100644 --- a/src/kernel/service/SchedulerService.h +++ b/src/kernel/service/SchedulerService.h @@ -1,4 +1,64 @@ #ifndef CHURLOS_SCHEDULERSERVICE_H #define CHURLOS_SCHEDULERSERVICE_H +#include "Service.h" +#include "lib/memory/UniquePointer.h" +#include "kernel/process/Thread.h" +#include "kernel/process/Scheduler.h" + +namespace Kernel { + +/** + * This class implements the scheduling system service. + */ +class SchedulerService : public Service { +public: + static const constexpr uint8_t ID = Service::SCHEDULER; + +public: + SchedulerService() = default; + + // TODO: Rest of constructors + + // Helper that directly constructs the thread, then readys it + template + uint32_t ready(Args... args) { + Memory::unique_ptr thread = Memory::make_unique(std::forward(args)...); + uint32_t tid = thread->tid; + + scheduler.ready(std::move(thread)); + + return tid; + } + + /** + * Starts the first thread in the schedulers ready_queue. + */ + void startScheduling(); + + [[nodiscard]] uint16_t active() const; + + /** + * Interrupts current thread execution and switch to the next thread. + */ + void yield(); + + void block(); + + void deblock(uint16_t tid); + + void exit(); + + void suicide(uint16_t tid); + + void kill(uint16_t tid); + + // TODO: Thread that cleans up exited threads + +private: + Scheduler scheduler; +}; + +} + #endif //CHURLOS_SCHEDULERSERVICE_H