|
|
@@ -1,20 +1,6 @@
|
|
|
#include "kernel.h"
|
|
|
#include "scheduler.h"
|
|
|
|
|
|
-static inline zv_process_t * zv_kernel_select_interrupted(zv_kernel_t *self) {
|
|
|
- zv_process_t *selected = self->processes;
|
|
|
-
|
|
|
- while (selected != (self->processes + self->processes_count)) {
|
|
|
- if (selected->state == ZV_INTERRUPTED) {
|
|
|
- return selected;
|
|
|
- }
|
|
|
-
|
|
|
- ++selected;
|
|
|
- }
|
|
|
-
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
static inline void zv_kernel_exec_process(
|
|
|
zv_kernel_t *self,
|
|
|
zv_process_t *target
|
|
|
@@ -41,7 +27,7 @@ static inline void zv_kernel_exec_process(
|
|
|
|
|
|
static inline zv_process_t * zv_kernel_select_process(zv_kernel_t *self) {
|
|
|
if (self->interrupts > 0) {
|
|
|
- zv_process_t *selected = zv_kernel_select_interrupted(self);
|
|
|
+ zv_process_t *selected = zv_kernel_scheduler_select_interrupted(self);
|
|
|
|
|
|
if (selected != NULL) {
|
|
|
return selected;
|
|
|
@@ -50,31 +36,25 @@ static inline zv_process_t * zv_kernel_select_process(zv_kernel_t *self) {
|
|
|
self->interrupts = 0;
|
|
|
}
|
|
|
|
|
|
- switch (self->mode) {
|
|
|
- case ZV_FIRST_MATCH:
|
|
|
- case ZV_ROUND_ROBIN_FIRST_MATCH:
|
|
|
- return zv_kernel_round_first_match(self);
|
|
|
+ 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);
|
|
|
|
|
|
- case ZV_BALANCED_PRIORITY:
|
|
|
- return zv_kernel_balanced_priority(self);
|
|
|
-
|
|
|
- case ZV_NON_BALANCED_PRIORITY:
|
|
|
- return zv_kernel_non_balanced_priority(self);
|
|
|
+ if (selected == NULL) {
|
|
|
+ zv_kernel_idle_task();
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- return NULL;
|
|
|
+ zv_kernel_exec_process(self, selected);
|
|
|
+ self->last = zv_kernel_get_pid(self, selected);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-bool zv_kernel_scheduler(zv_kernel_t *self) {
|
|
|
+void zv_kernel_scheduler(zv_kernel_t *self) {
|
|
|
while (true) {
|
|
|
- zv_process_t *selected = zv_kernel_select_process(self);
|
|
|
- zv_kernel_exec_process(self, selected);
|
|
|
-
|
|
|
- self->last = zv_kernel_get_pid(self, selected);
|
|
|
+ zv_kernel_scheduler_single_loop(self);
|
|
|
}
|
|
|
-
|
|
|
- return true;
|
|
|
}
|
|
|
|
|
|
|