wait_queue.c 1.5 KB

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