| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #include "kernel.h"
- void zv_kernel_init(
- zv_kernel_t *self,
- zv_process_t *processes,
- zv_pid_t size
- ) {
- self->processes = processes;
- self->processes_count = size;
- self->last = 0;
- self->interrupts = 0;
- self->mode = ZV_FIRST_MATCH;
- self->lowest_priority = 0;
- for (zv_pid_t count = 0; count < size; ++count) {
- zv_process_t *current = self->processes + count;
-
- current->state = ZV_EMPTY;
- current->worker = (zv_worker_t) NULL;
- current->param = ZV_NULL_PARAM;
- current->priority = 0;
- }
- }
- zv_pid_t zv_kernel_add_process(
- zv_kernel_t *self,
- zv_worker_t worker,
- zv_universal_t param,
- zv_priority_t priority
- ) {
- for (zv_pid_t count = 0; count < self->processes_count; ++count) {
- zv_process_t *current = self->processes + count;
- if (current->state != ZV_EMPTY) {
- continue;
- }
- current->worker = worker;
- current->param = param;
- current->priority = priority;
- current->balance = 0;
- current->state = ZV_READY;
- return count;
- }
- return ZV_ERROR_PID;
- }
- bool zv_kernel_set_scheduler(zv_kernel_t *self, zv_scheduler_mode_t target) {
- #ifdef ZV_KERNEL_SCHEDULER_SINGLE_MODE
- return false;
- #else
- self->mode = target;
- return true;
- #endif
- }
- void __zv_kernel_clean_balance(zv_kernel_t *self) {
- for (zv_pid_t count = 0; count < self->processes_count; ++count) {
- zv_process_t *current = self->processes + count;
- current->balance = 0;
- }
- }
- zv_result_t zv_kernel_trigger_process(zv_kernel_t *self, zv_pid_t target) {
- zv_process_t *current = __zv_kernel_get_process(self, target);
-
- if (current == NULL || current->state == ZV_EMPTY) {
- return ZV_NOT_EXISTS;
- }
- if (current->state != ZV_INTERRUPT_WAITING) {
- return ZV_BAD_STATE;
- }
- ++self->interrupts;
- self->processes->state = ZV_INTERRUPTED;
- return ZV_SUCCESS;
- }
- zv_result_t zv_kernel_awake_process(zv_kernel_t *self, zv_pid_t target) {
- zv_process_t *current = __zv_kernel_get_process(self, target);
-
- if (current == NULL || current->state == ZV_EMPTY) {
- return ZV_NOT_EXISTS;
- }
-
- if (current->state != ZV_WAITING) {
- return ZV_BAD_STATE;
- }
- current->state = ZV_READY;
- return ZV_SUCCESS;
- }
|