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