1
0

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 <rtdef.h>
  14. #include <rtconfig.h>
  15. #define RT_WQ_FLAG_CLEAN 0x00
  16. #define RT_WQ_FLAG_WAKEUP 0x01
  17. struct rt_wqueue_node;
  18. typedef int (*rt_wqueue_func_t)(struct rt_wqueue_node *wait, void *key);
  19. struct rt_wqueue_node
  20. {
  21. rt_thread_t polling_thread;
  22. rt_list_t list;
  23. rt_wqueue_func_t wakeup;
  24. rt_uint32_t key;
  25. };
  26. typedef struct rt_wqueue_node rt_wqueue_node_t;
  27. int __wqueue_default_wake(struct rt_wqueue_node *wait, void *key);
  28. rt_inline void rt_wqueue_init(rt_wqueue_t *queue)
  29. {
  30. RT_ASSERT(queue != RT_NULL);
  31. queue->flag = RT_WQ_FLAG_CLEAN;
  32. rt_list_init(&(queue->waiting_list));
  33. }
  34. void rt_wqueue_add(rt_wqueue_t *queue, struct rt_wqueue_node *node);
  35. void rt_wqueue_remove(struct rt_wqueue_node *node);
  36. int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int timeout);
  37. int rt_wqueue_wait_killable(rt_wqueue_t *queue, int condition, int timeout);
  38. int rt_wqueue_wait_interruptible(rt_wqueue_t *queue, int condition, int timeout);
  39. void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key);
  40. #define DEFINE_WAIT_FUNC(name, function) \
  41. struct rt_wqueue_node name = { \
  42. rt_current_thread, \
  43. RT_LIST_OBJECT_INIT(((name).list)), \
  44. function, \
  45. 0 \
  46. }
  47. #define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, __wqueue_default_wake)
  48. #endif