فهرست منبع

Add process manage functions.

Cixo Develop 2 ماه پیش
والد
کامیت
a22104af25
7فایلهای تغییر یافته به همراه95 افزوده شده و 14 حذف شده
  1. 2 0
      make_linux.sh
  2. 8 0
      source/coroutine.h
  3. 10 0
      source/event.c
  4. 4 1
      source/event.h
  5. 59 7
      source/kernel.c
  6. 8 0
      source/kernel.h
  7. 4 6
      source/process.h

+ 2 - 0
make_linux.sh

@@ -1,5 +1,7 @@
 #!/bin/bash
 
+clear
+
 project=$(dirname $(realpath $0))
 sources=$(ls $project/source/*.c)
 

+ 8 - 0
source/coroutine.h

@@ -0,0 +1,8 @@
+#ifndef CM_MLEMOS_COROUTINE_H_INCLUDED
+#define CM_MLEMOS_COROUTINE_H_INCLUDED
+
+#include "exception.h"
+
+typedef cm_exception_t (*cm_coroutine_t) (void *, void *);
+
+#endif

+ 10 - 0
source/event.c

@@ -0,0 +1,10 @@
+#include <stdint.h>
+
+#include "event.h"
+
+cm_event_t cm_empty_event() {
+    cm_event_t target;
+
+    target.type = CM_EVENT_BLANK;
+    target.parameter = (uintptr_t) 0x00;
+}

+ 4 - 1
source/event.h

@@ -2,6 +2,7 @@
 #define CX_MLEMOS_EVENT_H_INCLUDED
 
 typedef enum cm_event_type_e {
+    CM_EVENT_BLANK,
     CM_EVENT_TRIGGER,
     CM_EVENT_IDLE,
     CM_EVENT_IRQ,
@@ -13,6 +14,8 @@ typedef enum cm_event_type_e {
 typedef struct cm_event_s {
     cm_event_type_t type;
     void *parameter;
-} cm_event_tl
+} cm_event_t;
+
+cm_event_t cm_empty_event();
 
 #endif

+ 59 - 7
source/kernel.c

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

+ 8 - 0
source/kernel.h

@@ -4,7 +4,12 @@
 #include <stdint.h>
 #include <stdbool.h>
 
+#include "event.h"
 #include "process.h"
+#include "coroutine.h"
+
+typedef size_t cm_pid_t;
+#define CM_NULL_PID 0
 
 typedef struct cm_kernel_s {
     cm_process_t *processes;
@@ -17,4 +22,7 @@ bool cm_kernel_drop_static(cm_kernel_t *);
 bool cm_kernel_init(cm_kernel_t *, size_t);
 bool cm_kernel_drop(cm_kernel_t *);
 
+cm_pid_t cm_create_process(cm_kernel_t *, cm_coroutine_t, cm_event_t);
+bool cm_kill_process(cm_kernel_t *, cm_pid_t);
+
 #endif

+ 4 - 6
source/process.h

@@ -1,16 +1,14 @@
 #ifndef CX_MLEMOS_PROCESS_H_INCLUDED
 #define CX_MLEMOS_PROCESS_H_INCLUDED
 
-#include "exception.h"
 #include "event.h"
+#include "kernel.h"
+#include "coroutine.h"
+#include "exception.h"
 
 typedef struct cm_process_s {
     cm_event_t event;
-
-    cm_exception_t (*coroutine) (
-        struct cm_kernel_s *, 
-        struct cm_process_s *
-    );
+    cm_coroutine_t coroutine;
 } cm_process_t;
 
 #endif