Implement SchedulerService
This commit is contained in:
@ -1 +1,37 @@
|
|||||||
#include "SchedulerService.h"
|
#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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -1,4 +1,64 @@
|
|||||||
#ifndef CHURLOS_SCHEDULERSERVICE_H
|
#ifndef CHURLOS_SCHEDULERSERVICE_H
|
||||||
#define 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<typename T, typename... Args>
|
||||||
|
uint32_t ready(Args... args) {
|
||||||
|
Memory::unique_ptr<Thread> thread = Memory::make_unique<T>(std::forward<Args>(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
|
#endif //CHURLOS_SCHEDULERSERVICE_H
|
||||||
|
Reference in New Issue
Block a user