workqueue.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. * 2021-08-01 Meco Man remove rt_delayed_work_init() and rt_delayed_work structure
  9. */
  10. #ifndef WORKQUEUE_H__
  11. #define WORKQUEUE_H__
  12. #include <rtthread.h>
  13. enum
  14. {
  15. RT_WORK_STATE_PENDING = 0x0001, /* Work item pending state */
  16. RT_WORK_STATE_SUBMITTING = 0x0002, /* Work item submitting state */
  17. };
  18. /**
  19. * work type defitions
  20. */
  21. enum
  22. {
  23. RT_WORK_TYPE_DELAYED = 0x0001,
  24. };
  25. /* workqueue implementation */
  26. struct rt_workqueue
  27. {
  28. rt_list_t work_list;
  29. rt_list_t delayed_list;
  30. struct rt_work *work_current; /* current work */
  31. struct rt_semaphore sem;
  32. rt_thread_t work_thread;
  33. };
  34. struct rt_work
  35. {
  36. rt_list_t list;
  37. void (*work_func)(struct rt_work *work, void *work_data);
  38. void *work_data;
  39. rt_uint16_t flags;
  40. rt_uint16_t type;
  41. struct rt_timer timer;
  42. struct rt_workqueue *workqueue;
  43. };
  44. #ifdef RT_USING_HEAP
  45. /**
  46. * WorkQueue for DeviceDriver
  47. */
  48. struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority);
  49. rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue);
  50. rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work);
  51. rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t time);
  52. rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work);
  53. rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work);
  54. rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue);
  55. rt_err_t rt_workqueue_critical_work(struct rt_workqueue *queue, struct rt_work *work);
  56. #ifdef RT_USING_SYSTEM_WORKQUEUE
  57. rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t time);
  58. rt_err_t rt_work_cancel(struct rt_work *work);
  59. #endif /* RT_USING_SYSTEM_WORKQUEUE */
  60. /**
  61. * @brief Init a work item, and bind it with a callback function.
  62. *
  63. * @param work A pointer to work item object.
  64. * @param work_func A callback function will be called when this work item is being executed.
  65. * @param work_data A user data passed to the callback function as it's second parameter.
  66. */
  67. rt_inline void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data),
  68. void *work_data)
  69. {
  70. rt_list_init(&(work->list));
  71. work->work_func = work_func;
  72. work->work_data = work_data;
  73. work->workqueue = RT_NULL;
  74. work->flags = 0;
  75. work->type = 0;
  76. }
  77. #endif /* RT_USING_HEAP */
  78. #endif