waitqueue.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*
  2. * Copyright (c) 2006-2021, 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. void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key);
  37. #define DEFINE_WAIT_FUNC(name, function) \
  38. struct rt_wqueue_node name = { \
  39. rt_current_thread, \
  40. RT_LIST_OBJECT_INIT(((name).list)), \
  41. \
  42. function, \
  43. 0 \
  44. }
  45. #define DEFINE_WAIT(name) DEFINE_WAIT_FUNC(name, __wqueue_default_wake)
  46. #endif