#include "kernel.h" #include "scheduler.h" static inline void zv_kernel_exec_process( zv_kernel_t *self, zv_process_t *target ) { bool was_interrupted = (target->state == ZV_INTERRUPTED); if (was_interrupted && self->interrupts > 0) { --self->interrupts; } target->state = ZV_WORKING; zv_state_t result = target->worker(self, target); if (result == ZV_WORKING || result == ZV_INTERRUPTED) { result = ZV_READY; } if (was_interrupted) { result = ZV_INTERRUPT_WAITING; } target->state = result; } static inline zv_process_t * zv_kernel_select_process(zv_kernel_t *self) { if (self->interrupts > 0) { zv_process_t *selected = zv_kernel_scheduler_select_interrupted(self); if (selected != NULL) { return selected; } self->interrupts = 0; } return zv_kernel_scheduler_mode_selector(self); } void zv_kernel_scheduler_single_loop(zv_kernel_t *self) { zv_process_t *selected = zv_kernel_select_process(self); if (selected == NULL) { zv_kernel_idle_task(); return; } zv_kernel_exec_process(self, selected); self->last = zv_kernel_get_pid(self, selected); } void zv_kernel_scheduler(zv_kernel_t *self) { while (true) { zv_kernel_scheduler_single_loop(self); } }