|  | @@ -1,20 +1,85 @@
 | 
	
		
			
				|  |  |  #include <stdint.h>
 | 
	
		
			
				|  |  | +#include <malloc.h>
 | 
	
		
			
				|  |  | +#include <stdbool.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include "kernel.h"
 | 
	
		
			
				|  |  | -#include "event.h"
 | 
	
		
			
				|  |  |  #include "process.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void cm_kernel_init_static(
 | 
	
		
			
				|  |  | -    cm_kernel_t *self, 
 | 
	
		
			
				|  |  | -    cm_process_t *processes,
 | 
	
		
			
				|  |  | -    uint16_t processes_count,
 | 
	
		
			
				|  |  | -    cm_event_t *events,
 | 
	
		
			
				|  |  | -    uint16_t events_count
 | 
	
		
			
				|  |  | +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
 | 
	
		
			
				|  |  |  ) {
 | 
	
		
			
				|  |  | -    self->processes = processes;
 | 
	
		
			
				|  |  | -    self->processes_count = processes_count,
 | 
	
		
			
				|  |  | -    self->events = events;
 | 
	
		
			
				|  |  | -    self->events_count = events_count;
 | 
	
		
			
				|  |  | -    self->is_dynamic = false;
 | 
	
		
			
				|  |  | +    if (count == 0 || target == NUL) {
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (self->processes != NULL) {
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +    }   
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    self->processes = target;
 | 
	
		
			
				|  |  | +    self->processes_count = count;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    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 *) calloc(request_size);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (space == NULL) {
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    self->processes = space;
 | 
	
		
			
				|  |  | +    self->processes_count = count;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return true;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +bool cm_kernel_drop(cm_kernel_t *self) {
 | 
	
		
			
				|  |  | +    if (self->process_count == 0 || self.process == NULL) {
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    cm_process_t processes_heap = self->processes;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    self.processes_count = 0;
 | 
	
		
			
				|  |  | +    self.processes = NULL;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    free(processes_heap);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return true;
 | 
	
		
			
				|  |  | +}
 |