kernel.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <stdint.h>
  2. #include <malloc.h>
  3. #include <stdbool.h>
  4. #include "kernel.h"
  5. #include "process.h"
  6. static void cm_kernel_clear_processes_heap(cm_kernel_t *self) {
  7. cm_process_t *count = self->processes;
  8. if (count == NULL) {
  9. return;
  10. }
  11. while (count < self->processes + self->processes_count) {
  12. count->coroutine = NULL;
  13. }
  14. }
  15. bool cm_kernel_init_static(
  16. cm_kernel_t *self,
  17. cm_process_t *target,
  18. size_t count
  19. ) {
  20. if (count == 0 || target == NUL) {
  21. return false;
  22. }
  23. if (self->processes != NULL) {
  24. return false;
  25. }
  26. self->processes = target;
  27. self->processes_count = count;
  28. return true;
  29. }
  30. bool cm_kernel_drop_static(cm_kernel_t *self) {
  31. if (self->processes == NULL || self->processes_count == 0) {
  32. return false;
  33. }
  34. self->processes_count = 0;
  35. self->processes = (cm_process_t *) 0x00;
  36. return true;
  37. }
  38. bool cm_kernel_init(cm_kernel_t *self, size_t count) {
  39. if (self->processes != NULL) {
  40. return false;
  41. }
  42. if (count == 0) {
  43. return false;
  44. }
  45. size_t request_size = count * sizeof(cm_process_t);
  46. cm_process_t *space = (cm_process_t *) calloc(request_size);
  47. if (space == NULL) {
  48. return false;
  49. }
  50. self->processes = space;
  51. self->processes_count = count;
  52. return true;
  53. }
  54. bool cm_kernel_drop(cm_kernel_t *self) {
  55. if (self->process_count == 0 || self.process == NULL) {
  56. return false;
  57. }
  58. cm_process_t processes_heap = self->processes;
  59. self.processes_count = 0;
  60. self.processes = NULL;
  61. free(processes_heap);
  62. return true;
  63. }