kernel.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "kernel.h"
  2. void zv_kernel_init(
  3. zv_kernel_t *self,
  4. zv_process_t *processes,
  5. zv_pid_t size
  6. ) {
  7. self->processes = processes;
  8. self->processes_count = size;
  9. self->last = 0;
  10. self->interrupts = 0;
  11. self->mode = ZV_FIRST_MATCH;
  12. self->lowest_priority = 0;
  13. for (zv_pid_t count = 0; count < size; ++count) {
  14. zv_process_t *current = self->processes + count;
  15. current->state = ZV_EMPTY;
  16. current->worker = (zv_worker_t) NULL;
  17. current->param = ZV_NULL_PARAM;
  18. current->priority = 0;
  19. }
  20. }
  21. zv_pid_t zv_kernel_add_process(
  22. zv_kernel_t *self,
  23. zv_worker_t worker,
  24. zv_universal_t param,
  25. zv_priority_t priority
  26. ) {
  27. for (zv_pid_t count = 0; count < self->processes_count; ++count) {
  28. zv_process_t *current = self->processes + count;
  29. if (current->state != ZV_EMPTY) {
  30. continue;
  31. }
  32. current->worker = worker;
  33. current->param = param;
  34. current->priority = priority;
  35. current->balance = 0;
  36. current->state = ZV_READY;
  37. return count;
  38. }
  39. return ZV_ERROR_PID;
  40. }
  41. void __zv_kernel_clean_balance(zv_kernel_t *self) {
  42. for (zv_pid_t count = 0; count < self->processes_count; ++count) {
  43. zv_process_t *current = self->processes + count;
  44. current->balance = 0;
  45. }
  46. }
  47. zv_result_t zv_kernel_trigger_process(zv_kernel_t *self, zv_pid_t target) {
  48. zv_process_t *current = __zv_kernel_get_process(self, target);
  49. if (current == NULL || current->state == ZV_EMPTY) {
  50. return ZV_NOT_EXISTS;
  51. }
  52. if (current->state != ZV_INTERRUPT_WAITING) {
  53. return ZV_BAD_STATE;
  54. }
  55. ++self->interrupts;
  56. self->processes->state = ZV_INTERRUPTED;
  57. return ZV_SUCCESS;
  58. }
  59. zv_result_t zv_kernel_awake_process(zv_kernel_t *self, zv_pid_t target) {
  60. zv_process_t *current = __zv_kernel_get_process(self, target);
  61. if (current == NULL || current->state == ZV_EMPTY) {
  62. return ZV_NOT_EXISTS;
  63. }
  64. if (current->state != ZV_WAITING) {
  65. return ZV_BAD_STATE;
  66. }
  67. current->state = ZV_READY;
  68. return ZV_SUCCESS;
  69. }