workqueue.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. */
  9. #ifndef WORKQUEUE_H__
  10. #define WORKQUEUE_H__
  11. #include <rtthread.h>
  12. enum
  13. {
  14. RT_WORK_STATE_PENDING = 0x0001, /* Work item pending state */
  15. RT_WORK_STATE_SUBMITTING = 0x0002, /* Work item submitting state */
  16. };
  17. /**
  18. * work type defitions
  19. */
  20. enum
  21. {
  22. RT_WORK_TYPE_DELAYED = 0x0001,
  23. };
  24. /* workqueue implementation */
  25. struct rt_workqueue
  26. {
  27. rt_list_t work_list;
  28. rt_list_t delayed_list;
  29. struct rt_work *work_current; /* current work */
  30. struct rt_semaphore sem;
  31. rt_thread_t work_thread;
  32. };
  33. struct rt_work
  34. {
  35. rt_list_t list;
  36. void (*work_func)(struct rt_work *work, void *work_data);
  37. void *work_data;
  38. rt_uint16_t flags;
  39. rt_uint16_t type;
  40. struct rt_timer timer;
  41. struct rt_workqueue *workqueue;
  42. };
  43. struct rt_delayed_work
  44. {
  45. struct rt_work work;
  46. };
  47. #ifdef RT_USING_HEAP
  48. /**
  49. * WorkQueue for DeviceDriver
  50. */
  51. struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority);
  52. rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue);
  53. rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work);
  54. rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t time);
  55. rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work);
  56. rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work);
  57. rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue);
  58. rt_err_t rt_workqueue_critical_work(struct rt_workqueue *queue, struct rt_work *work);
  59. #ifdef RT_USING_SYSTEM_WORKQUEUE
  60. rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t time);
  61. rt_err_t rt_work_cancel(struct rt_work *work);
  62. #endif
  63. rt_inline void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data),
  64. void *work_data)
  65. {
  66. rt_list_init(&(work->list));
  67. work->work_func = work_func;
  68. work->work_data = work_data;
  69. work->workqueue = RT_NULL;
  70. work->flags = 0;
  71. work->type = 0;
  72. }
  73. void rt_delayed_work_init(struct rt_delayed_work *work, void (*work_func)(struct rt_work *work,
  74. void *work_data), void *work_data);
  75. int rt_work_sys_workqueue_init(void);
  76. #endif
  77. #endif