workqueue.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * Copyright (c) 2006-2018, 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, /* Work item pending state */
  15. };
  16. /**
  17. * work type defitions
  18. */
  19. enum
  20. {
  21. RT_WORK_TYPE_DELAYED,
  22. };
  23. /* workqueue implementation */
  24. struct rt_workqueue
  25. {
  26. rt_list_t work_list;
  27. struct rt_work *work_current; /* current work */
  28. struct rt_semaphore sem;
  29. rt_thread_t work_thread;
  30. };
  31. struct rt_work
  32. {
  33. rt_list_t list;
  34. void (*work_func)(struct rt_work *work, void *work_data);
  35. void *work_data;
  36. rt_uint16_t flags;
  37. rt_uint16_t type;
  38. };
  39. struct rt_delayed_work
  40. {
  41. struct rt_work work;
  42. struct rt_timer timer;
  43. struct rt_workqueue *workqueue;
  44. };
  45. #ifdef RT_USING_HEAP
  46. /**
  47. * WorkQueue for DeviceDriver
  48. */
  49. struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority);
  50. rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue);
  51. rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work);
  52. rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t time);
  53. rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work);
  54. rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work);
  55. #ifdef RT_USING_SYSTEM_WORKQUEUE
  56. rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t time);
  57. rt_err_t rt_work_cancel(struct rt_work *work);
  58. #endif
  59. rt_inline void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data),
  60. void *work_data)
  61. {
  62. rt_list_init(&(work->list));
  63. work->work_func = work_func;
  64. work->work_data = work_data;
  65. }
  66. void rt_delayed_work_init(struct rt_delayed_work *work, void (*work_func)(struct rt_work *work,
  67. void *work_data), void *work_data);
  68. #endif
  69. #endif