|  | @@ -22,7 +22,7 @@ bool cm_kernel_init_static(
 | 
	
		
			
				|  |  |      cm_process_t *target,
 | 
	
		
			
				|  |  |      size_t count
 | 
	
		
			
				|  |  |  ) {
 | 
	
		
			
				|  |  | -    if (count == 0 || target == NUL) {
 | 
	
		
			
				|  |  | +    if (count == 0 || target == NULL) {
 | 
	
		
			
				|  |  |          return false;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -33,6 +33,8 @@ bool cm_kernel_init_static(
 | 
	
		
			
				|  |  |      self->processes = target;
 | 
	
		
			
				|  |  |      self->processes_count = count;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    cm_kernel_clear_processes_heap(self);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      return true;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -57,7 +59,7 @@ bool cm_kernel_init(cm_kernel_t *self, size_t count) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      size_t request_size = count * sizeof(cm_process_t);
 | 
	
		
			
				|  |  | -    cm_process_t *space = (cm_process_t *) calloc(request_size);
 | 
	
		
			
				|  |  | +    cm_process_t *space = (cm_process_t *) malloc(request_size);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (space == NULL) {
 | 
	
		
			
				|  |  |          return false;
 | 
	
	
		
			
				|  | @@ -66,20 +68,70 @@ bool cm_kernel_init(cm_kernel_t *self, size_t count) {
 | 
	
		
			
				|  |  |      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->process_count == 0 || self.process == NULL) {
 | 
	
		
			
				|  |  | +    if (self->processes_count == 0 || self->processes == NULL) {
 | 
	
		
			
				|  |  |          return false;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    cm_process_t processes_heap = self->processes;
 | 
	
		
			
				|  |  | +    cm_process_t *processes_heap = self->processes;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    self.processes_count = 0;
 | 
	
		
			
				|  |  | -    self.processes = NULL;
 | 
	
		
			
				|  |  | +    self->processes_count = 0;
 | 
	
		
			
				|  |  | +    self->processes = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    free(processes_heap);
 | 
	
		
			
				|  |  | +    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;
 | 
	
		
			
				|  |  | +}   
 |