waitqueue.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018/06/26 Bernard Fix the wait queue issue when wakeup a soon
  9. * to blocked thread.
  10. */
  11. #ifndef WAITQUEUE_H__
  12. #define WAITQUEUE_H__
  13. #include <rtthread.h>
  14. #define RT_WQ_FLAG_CLEAN 0x00
  15. #define RT_WQ_FLAG_WAKEUP 0x01
  16. struct rt_wqueue_node;
  17. typedef int (*rt_wqueue_func_t)(struct rt_wqueue_node *wait, void *key);
  18. struct rt_wqueue_node
  19. {
  20. rt_thread_t polling_thread;
  21. rt_list_t list;
  22. rt_wqueue_func_t wakeup;
  23. rt_uint32_t key;
  24. };
  25. typedef struct rt_wqueue_node rt_wqueue_node_t;
  26. int __wqueue_default_wake(struct rt_wqueue_node *wait, void *key);
  27. rt_inline void rt_wqueue_init(rt_wqueue_t *queue)
  28. {
  29. RT_ASSERT(queue != RT_NULL);
  30. queue->flag = RT_WQ_FLAG_CLEAN;
  31. rt_list_init(&(queue->waiting_list));
  32. }
  33. void rt_wqueue_add(rt_wqueue_t *queue, struct rt_wqueue_node *node);
  34. void rt_wqueue_remove(struct rt_wqueue_node *node);
  35. int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int timeout);
  36. int rt_wqueue_wait_killable(rt_wqueue_t *queue, int condition, int timeout);
  37. int rt_wqueue_wait_interruptible(rt_wqueue_t *queue, int condition, int timeout);
  38. void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key);
  39. #define DEFINE_WAIT_FUNC(name, function) \
  40. struct rt_wqueue_node name = { \
  41. rt_current_thread, \
  42. RT_LIST_OBJECT_INIT(((name).list)), \
  43. \
  44. function, \
  45. 0 \
  46. }
  47. #define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, __wqueue_default_wake)
  48. #endif