waitqueue.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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_t *wqueue;
  24. rt_wqueue_func_t wakeup;
  25. rt_uint32_t key;
  26. };
  27. typedef struct rt_wqueue_node rt_wqueue_node_t;
  28. int __wqueue_default_wake(struct rt_wqueue_node *wait, void *key);
  29. rt_inline void rt_wqueue_init(rt_wqueue_t *queue)
  30. {
  31. RT_ASSERT(queue != RT_NULL);
  32. queue->flag = RT_WQ_FLAG_CLEAN;
  33. rt_list_init(&(queue->waiting_list));
  34. rt_spin_lock_init(&(queue->spinlock));
  35. }
  36. void rt_wqueue_add(rt_wqueue_t *queue, struct rt_wqueue_node *node);
  37. void rt_wqueue_remove(struct rt_wqueue_node *node);
  38. int rt_wqueue_wait(rt_wqueue_t *queue, int condition, int timeout);
  39. int rt_wqueue_wait_killable(rt_wqueue_t *queue, int condition, int timeout);
  40. int rt_wqueue_wait_interruptible(rt_wqueue_t *queue, int condition, int timeout);
  41. void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key);
  42. void rt_wqueue_wakeup_all(rt_wqueue_t *queue, void *key);
  43. #define DEFINE_WAIT_FUNC(name, function) \
  44. struct rt_wqueue_node name = { \
  45. rt_current_thread, \
  46. RT_LIST_OBJECT_INIT(((name).list)), \
  47. function, \
  48. 0 \
  49. }
  50. #define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, __wqueue_default_wake)
  51. #endif