balanced_priority_scheduler.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "kernel.h"
  2. #include "scheduler.h"
  3. #ifndef ZV_FULL_DISABLE_BALANCED_PRIORITY
  4. zv_process_t * zv_kernel_balanced_priority(zv_kernel_t *self) {
  5. zv_process_t *selected = NULL;
  6. zv_process_t *last = self->processes + self->last;
  7. zv_priority_t selected_priority = 0;
  8. bool full_round = true;
  9. for (
  10. zv_process_t *current = self->processes;
  11. current != (self->processes + self->processes_count);
  12. ++current
  13. ) {
  14. if (current->priority > self->lowest_priority) {
  15. self->lowest_priority = current->priority;
  16. }
  17. if (current->priority == self->lowest_priority) {
  18. full_round = full_round && current->balance > 0;
  19. }
  20. if (!zv_process_is_ready(current)) {
  21. continue;
  22. }
  23. zv_priority_t current_priority = _zv_process_calc_priority(current);
  24. if (current != last && current_priority > self->lowest_priority) {
  25. if (current->balance > 0) {
  26. --current->balance;
  27. }
  28. }
  29. if (selected == NULL) {
  30. selected = current;
  31. selected_priority = current_priority;
  32. continue;
  33. }
  34. if (current_priority <= selected_priority) {
  35. selected = current;
  36. selected_priority = current_priority;
  37. continue;
  38. }
  39. }
  40. if (full_round) {
  41. __zv_kernel_clean_balance(self);
  42. return zv_kernel_balanced_priority(self);
  43. }
  44. if (selected->balance < 255) {
  45. ++selected->balance;
  46. }
  47. return selected;
  48. }
  49. #else
  50. zv_process_t * zv_kernel_balanced_priority(zv_kernel_t *self) {
  51. return NULL;
  52. }
  53. #endif