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