kernel.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include <stdint.h>
  2. #include <stddef.h>
  3. #include <stdbool.h>
  4. #ifndef ZIVUOS_USE_STATIC
  5. #include <malloc.h>
  6. #endif
  7. #include "status.h"
  8. #include "models.h"
  9. #include "process.h"
  10. #include "kernel.h"
  11. /* Dynamic kernel creating. */
  12. #ifndef ZIVUOS_USE_STATIC
  13. zv_kernel_t * zv_kernel_create() {
  14. zv_kernel_t *self = (zv_kernel_t *) malloc(sizeof(zv_kernel_t));
  15. if (self == NULL) {
  16. return NULL;
  17. }
  18. self->is_dynamic = true;
  19. self->processes = NULL;
  20. self->processes_count = 0;
  21. self->current_max_pid = 0;
  22. return self;
  23. }
  24. void zv_kernel_close(zv_kernel_t *self) {
  25. if (!self->is_dynamic) {
  26. return;
  27. }
  28. zv_process_t *current = self->processes;
  29. while (current->next != NULL) {
  30. current = zv_process_remove(current);
  31. }
  32. free(self);
  33. }
  34. /* Static kernel creating. */
  35. #else
  36. zv_kernel_t * zv_kernel_create() {
  37. return NULL;
  38. }
  39. void zv_kernel_close(zv_kernel_t *self) {
  40. /* Not require to free not alloced resources. */
  41. }
  42. #endif
  43. zv_process_t * zv_kernel_get_oldest(zv_kernel_t *self) {
  44. zv_process_t *current = self->processes;
  45. zv_pid_t count = 0;
  46. zv_pid_t max = self->processes_count;
  47. if (current == NULL || max == 0) {
  48. return NULL;
  49. }
  50. while (current->next != NULL) {
  51. current = current->next;
  52. if (++count >= max) {
  53. return current;
  54. }
  55. }
  56. return current;
  57. }
  58. zv_process_t * zv_kernel_select_process(zv_kernel_t *self, zv_pid_t target) {
  59. zv_process_t *current = self->processes;
  60. zv_pid_t count = self->processes_count;
  61. while (true) {
  62. if (current == NULL || count == 0) {
  63. return NULL;
  64. }
  65. if (current->pid == target) {
  66. return current;
  67. }
  68. --count;
  69. current = current->next;
  70. }
  71. }
  72. zv_pid_t zv_kernel_attach_process(zv_kernel_t *self, zv_process_t *target) {
  73. zv_process_t *oldest = zv_kernel_get_oldest(self);
  74. ++self->processes_count;
  75. ++self->current_max_pid;
  76. target->pid = self->current_max_pid;
  77. oldest->next = target;
  78. return target->pid;
  79. }
  80. /* Dynamic process creating. */
  81. #ifndef ZIVUOS_USE_STATIC
  82. zv_process_t * zv_kernel_create_process(zv_kernel_t *self) {
  83. zv_process_t *target = zv_process_create();
  84. if (target == NULL) {
  85. return NULL;
  86. }
  87. target->status = ZV_STATUS_CREATING;
  88. zv_kernel_attach_process(self, target);
  89. return target;
  90. }
  91. #else
  92. zv_process_t * zv_kernel_create_process(zv_kernel_t *self) {
  93. return NULL;
  94. }
  95. #endif