|
|
@@ -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;
|
|
|
+}
|