workqueue.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. * 2021-08-01 Meco Man remove rt_delayed_work_init() and rt_delayed_work structure
  9. * 2021-08-14 Jackistang add comments for rt_work_init()
  10. */
  11. #ifndef WORKQUEUE_H__
  12. #define WORKQUEUE_H__
  13. #include <rtdef.h>
  14. #include <rtconfig.h>
  15. #include "completion.h"
  16. #ifdef __cplusplus
  17. extern "C" {
  18. #endif
  19. enum
  20. {
  21. RT_WORK_STATE_PENDING = 0x0001, /* Work item pending state */
  22. RT_WORK_STATE_SUBMITTING = 0x0002, /* Work item submitting state */
  23. };
  24. /**
  25. * work type definitions
  26. */
  27. enum
  28. {
  29. RT_WORK_TYPE_DELAYED = 0x0001,
  30. };
  31. /* workqueue implementation */
  32. struct rt_workqueue
  33. {
  34. rt_list_t work_list;
  35. rt_list_t delayed_list;
  36. struct rt_work *work_current; /* current work */
  37. struct rt_semaphore sem;
  38. rt_thread_t work_thread;
  39. struct rt_spinlock spinlock;
  40. struct rt_completion wakeup_completion;
  41. };
  42. struct rt_work
  43. {
  44. rt_list_t list;
  45. void (*work_func)(struct rt_work *work, void *work_data);
  46. void *work_data;
  47. rt_uint16_t flags;
  48. rt_uint16_t type;
  49. rt_tick_t timeout_tick;
  50. struct rt_workqueue *workqueue;
  51. };
  52. #ifdef RT_USING_HEAP
  53. /**
  54. * WorkQueue for DeviceDriver
  55. */
  56. void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data), void *work_data);
  57. struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority);
  58. rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue);
  59. rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work);
  60. rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t ticks);
  61. rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work);
  62. rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work);
  63. rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue);
  64. rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *work);
  65. #ifdef RT_USING_SYSTEM_WORKQUEUE
  66. rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t ticks);
  67. rt_err_t rt_work_urgent(struct rt_work *work);
  68. rt_err_t rt_work_cancel(struct rt_work *work);
  69. #endif /* RT_USING_SYSTEM_WORKQUEUE */
  70. #ifdef __cplusplus
  71. }
  72. #endif
  73. #endif /* RT_USING_HEAP */
  74. #endif