wait_queue.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "wait_queue.h"
  2. #include <sched/sched.h>
  3. #include <process/process.h>
  4. #include <mm/slab.h>
  5. /**
  6. * @brief 初始化等待队列
  7. *
  8. * @param wait_queue 等待队列
  9. * @param pcb pcb
  10. */
  11. void wait_queue_init(wait_queue_node_t *wait_queue, struct process_control_block *pcb)
  12. {
  13. list_init(&wait_queue->wait_list);
  14. wait_queue->pcb = pcb;
  15. }
  16. /**
  17. * @brief 在等待队列上进行等待
  18. *
  19. * @param wait_queue_head 队列头指针
  20. */
  21. void wait_queue_sleep_on(wait_queue_node_t *wait_queue_head)
  22. {
  23. wait_queue_node_t *wait = (wait_queue_node_t *)kmalloc(sizeof(wait_queue_node_t), 0);
  24. wait_queue_init(wait, current_pcb);
  25. current_pcb->state = PROC_UNINTERRUPTIBLE;
  26. list_append(&wait_queue_head->wait_list, &wait->wait_list);
  27. sched_cfs();
  28. }
  29. /**
  30. * @brief 在等待队列上进行等待(允许中断)
  31. *
  32. * @param wait_queue_head 队列头指针
  33. */
  34. void wait_queue_sleep_on_interriptible(wait_queue_node_t *wait_queue_head)
  35. {
  36. wait_queue_node_t *wait = (wait_queue_node_t *)kmalloc(sizeof(wait_queue_node_t), 0);
  37. wait_queue_init(wait, current_pcb);
  38. current_pcb->state = PROC_INTERRUPTIBLE;
  39. list_append(&wait_queue_head->wait_list, &wait->wait_list);
  40. sched_cfs();
  41. }
  42. /**
  43. * @brief 唤醒在等待队列的头部的进程
  44. *
  45. * @param wait_queue_head
  46. * @param state
  47. */
  48. void wait_queue_wakeup(wait_queue_node_t *wait_queue_head, int64_t state)
  49. {
  50. if (list_empty(&wait_queue_head->wait_list))
  51. return;
  52. wait_queue_node_t *wait = container_of(list_next(&wait_queue_head->wait_list), wait_queue_node_t, wait_list);
  53. // 符合唤醒条件
  54. if (wait->pcb->state & state)
  55. {
  56. list_del(&wait->wait_list);
  57. process_wakeup(wait->pcb);
  58. kfree(wait);
  59. }
  60. }