workqueue.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /**
  2. * RT-Thread RuiChing
  3. *
  4. * COPYRIGHT (C) 2024-2025 Shanghai Real-Thread Electronic Technology Co., Ltd.
  5. * All rights reserved.
  6. *
  7. * The license and distribution terms for this file may be
  8. * found in the file LICENSE in this distribution.
  9. */
  10. #ifndef __WORKQUEUE_H__
  11. #define __WORKQUEUE_H__
  12. #include <kpi.h>
  13. #include <rtconfig.h>
  14. #include <rtdef.h>
  15. #include "completion.h"
  16. enum
  17. {
  18. RT_WORK_STATE_PENDING = 0x0001, /* Work item pending state */
  19. RT_WORK_STATE_SUBMITTING = 0x0002, /* Work item submitting state */
  20. };
  21. /**
  22. * work type definitions
  23. */
  24. enum
  25. {
  26. RT_WORK_TYPE_DELAYED = 0x0001,
  27. };
  28. /* workqueue implementation */
  29. struct rt_workqueue
  30. {
  31. rt_list_t work_list;
  32. rt_list_t delayed_list;
  33. struct rt_work *work_current; /* current work */
  34. struct rt_semaphore sem;
  35. rt_thread_t work_thread;
  36. struct rt_spinlock spinlock;
  37. struct rt_completion wakeup_completion;
  38. };
  39. struct rt_work
  40. {
  41. rt_list_t list;
  42. void (*work_func)(struct rt_work *work, void *work_data);
  43. void *work_data;
  44. rt_uint16_t flags;
  45. rt_uint16_t type;
  46. rt_tick_t timeout_tick;
  47. struct rt_workqueue *workqueue;
  48. };
  49. #ifdef RT_USING_HEAP
  50. /**
  51. * WorkQueue for DeviceDriver
  52. */
  53. typedef void (*__kpi_rt_work_init)(struct rt_work *work,
  54. void (*work_func)(struct rt_work *work, void *work_data),
  55. void *work_data);
  56. typedef struct rt_workqueue *(*__kpi_rt_workqueue_create)(
  57. const char *name, rt_uint16_t stack_size, rt_uint8_t priority);
  58. typedef rt_err_t (*__kpi_rt_workqueue_destroy)(struct rt_workqueue *queue);
  59. typedef rt_err_t (*__kpi_rt_workqueue_dowork)(
  60. struct rt_workqueue *queue, struct rt_work *work);
  61. typedef rt_err_t (*__kpi_rt_workqueue_submit_work)(
  62. struct rt_workqueue *queue, struct rt_work *work, rt_tick_t ticks);
  63. typedef rt_err_t (*__kpi_rt_workqueue_cancel_work)(
  64. struct rt_workqueue *queue, struct rt_work *work);
  65. typedef rt_err_t (*__kpi_rt_workqueue_cancel_work_sync)(
  66. struct rt_workqueue *queue, struct rt_work *work);
  67. typedef rt_err_t (*__kpi_rt_workqueue_cancel_all_work)(
  68. struct rt_workqueue *queue);
  69. typedef rt_err_t (*__kpi_rt_workqueue_urgent_work)(
  70. struct rt_workqueue *queue, struct rt_work *work);
  71. #ifdef RT_USING_SYSTEM_WORKQUEUE
  72. typedef rt_err_t (*__kpi_rt_work_submit)(struct rt_work *work, rt_tick_t ticks);
  73. typedef rt_err_t (*__kpi_rt_work_urgent)(struct rt_work *work);
  74. typedef rt_err_t (*__kpi_rt_work_cancel)(struct rt_work *work);
  75. #endif /* RT_USING_SYSTEM_WORKQUEUE */
  76. #endif /* RT_USING_HEAP */
  77. KPI_EXTERN(rt_work_init);
  78. KPI_EXTERN(rt_workqueue_create);
  79. KPI_EXTERN(rt_workqueue_destroy);
  80. KPI_EXTERN(rt_workqueue_dowork);
  81. KPI_EXTERN(rt_workqueue_submit_work);
  82. KPI_EXTERN(rt_workqueue_cancel_work);
  83. KPI_EXTERN(rt_workqueue_cancel_work_sync);
  84. KPI_EXTERN(rt_workqueue_cancel_all_work);
  85. KPI_EXTERN(rt_workqueue_urgent_work);
  86. KPI_EXTERN(rt_work_submit);
  87. KPI_EXTERN(rt_work_urgent);
  88. KPI_EXTERN(rt_work_cancel);
  89. #endif /* __WORKQUEUE_H__ */