| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #include <stdint.h>
- #include <malloc.h>
- #include <stdbool.h>
- #include "kernel.h"
- #include "process.h"
- static void cm_kernel_clear_processes_heap(cm_kernel_t *self) {
- cm_process_t *count = self->processes;
- if (count == NULL) {
- return;
- }
-
- while (count < self->processes + self->processes_count) {
- count->coroutine = NULL;
- }
- }
- bool cm_kernel_init_static(
- cm_kernel_t *self,
- cm_process_t *target,
- size_t count
- ) {
- if (count == 0 || target == NULL) {
- return false;
- }
- if (self->processes != NULL) {
- return false;
- }
- self->processes = target;
- self->processes_count = count;
- cm_kernel_clear_processes_heap(self);
- return true;
- }
- bool cm_kernel_drop_static(cm_kernel_t *self) {
- if (self->processes == NULL || self->processes_count == 0) {
- return false;
- }
- self->processes_count = 0;
- self->processes = (cm_process_t *) 0x00;
- return true;
- }
- bool cm_kernel_init(cm_kernel_t *self, size_t count) {
- if (self->processes != NULL) {
- return false;
- }
- if (count == 0) {
- return false;
- }
- size_t request_size = count * sizeof(cm_process_t);
- cm_process_t *space = (cm_process_t *) malloc(request_size);
- if (space == NULL) {
- return false;
- }
-
- self->processes = space;
- self->processes_count = count;
- cm_kernel_clear_processes_heap(self);
- return true;
- }
- bool cm_kernel_drop(cm_kernel_t *self) {
- if (self->processes_count == 0 || self->processes == NULL) {
- return false;
- }
- cm_process_t *processes_heap = self->processes;
- self->processes_count = 0;
- self->processes = NULL;
- free((void *) processes_heap);
- return true;
- }
- cm_pid_t cm_create_process(
- cm_kernel_t *self,
- cm_coroutine_t coroutine,
- cm_event_t event
- ) {
- if (self->processes_count == 0 || self->processes == NULL) {
- return CM_NULL_PID;
- }
- cm_process_t *selected = self->processes;
- cm_process_t *last = self->processes + self->processes_count;
- while (selected < last && selected->coroutine != NULL) {
- ++selected;
- }
- if (selected == last) {
- return CM_NULL_PID;
- }
- selected->event = event;
- selected->coroutine = coroutine;
- cm_pid_t result = selected - self->processes;
- result = result + 1;
- return result;
- }
- bool cm_kill_process(cm_kernel_t *self, cm_pid_t target_pid) {
- if (self->processes == NULL || self->processes_count == 0) {
- return false;
- }
- size_t position = target_pid - 1;
- if (position >= self->processes_count) {
- return false;
- }
- cm_process_t *target = self->processes + position;
-
- target->event = cm_empty_event();
- target->coroutine = NULL;
- return true;
- }
|