kernel.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include <stddef.h>
  2. #include <stdint.h>
  3. #include "task.h"
  4. #include "kernel.h"
  5. #include "scheduler.h"
  6. bool zv_kernel_init(zv_kernel_t *self, zv_task_t *tasks, zv_tid_t count) {
  7. if (self == NULL || tasks == NULL || count < 1) {
  8. return false;
  9. }
  10. self->tasks = tasks;
  11. self->tasks_count = count;
  12. self->scheduler = ZV_SCHEDULER_PRIORITY_AGING;
  13. for (zv_tid_t count = 0; count < self->tasks_count; ++count) {
  14. zv_task_t *current = self->tasks + count;
  15. current->state = ZV_TASK_EMPTY;
  16. }
  17. return true;
  18. }
  19. bool zv_kernel_boot(zv_kernel_t *self) {
  20. if (self == NULL || self->tasks == NULL || self->tasks_count < 1) {
  21. return false;
  22. }
  23. while (true) {
  24. __zv_scheduler_update_tasks(self);
  25. zv_task_t *next = __zv_scheduler_find_task(self);
  26. if (next == NULL) {
  27. break;
  28. }
  29. __zv_scheduler_run_task(self, next);
  30. }
  31. return true;
  32. }
  33. zv_tid_t __zv_kernel_get_empty_slot(zv_kernel_t *self) {
  34. for (zv_tid_t count = 0; count < self->tasks_count; ++count) {
  35. zv_task_t *current = self->tasks + count;
  36. if (current->state == ZV_TASK_EMPTY) {
  37. return count;
  38. }
  39. }
  40. return ZV_TID_NULL;
  41. }
  42. zv_task_t *__zv_kernel_get_task(zv_kernel_t *self, zv_tid_t target) {
  43. if (self->tasks_count <= target) {
  44. return NULL;
  45. }
  46. return self->tasks + target;
  47. }
  48. zv_tid_t zv_kernel_create_process(
  49. zv_kernel_t *self,
  50. zv_worker_t worker,
  51. zv_priority_t priority,
  52. void *param
  53. ) {
  54. if (self == NULL || worker == NULL) {
  55. return ZV_TID_NULL;
  56. }
  57. zv_tid_t target_tid = __zv_kernel_get_empty_slot(self);
  58. zv_task_t *target = __zv_kernel_get_task(self, target_tid);
  59. if (target == NULL) {
  60. return ZV_TID_NULL;
  61. }
  62. target->worker = worker;
  63. target->param = param;
  64. target->priority = priority;
  65. target->event.type = ZV_EVENT_EMPTY;
  66. target->event.content.unumber = 0x00;
  67. target->state = ZV_TASK_READY;
  68. return target_tid;
  69. }
  70. bool zv_kernel_kill_process(
  71. zv_kernel_t *self,
  72. zv_tid_t target_tid
  73. ) {
  74. if (self == NULL) {
  75. return false;
  76. }
  77. zv_task_t *target = __zv_kernel_get_task(self, target_tid);
  78. if (target == NULL) {
  79. return false;
  80. }
  81. target->state = ZV_TASK_EMPTY;
  82. return true;
  83. }
  84. zv_tid_t __zv_kernel_get_tid(zv_kernel_t *self, zv_task_t *target) {
  85. return target - self->tasks;
  86. }