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