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