| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- #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);
- }
- }
|