11/*
2- * Copyright (c) 2006-2023 , RT-Thread Development Team
2+ * Copyright (c) 2006-2026 , RT-Thread Development Team
33 *
44 * SPDX-License-Identifier: Apache-2.0
55 *
2323{
2424 RT_WORK_STATE_PENDING = 0x0001 , /* Work item pending state */
2525 RT_WORK_STATE_SUBMITTING = 0x0002 , /* Work item submitting state */
26+ RT_WORK_STATE_CANCELING = 0x0004 , /* Work item canceling state */
27+ RT_WORK_STATE_DONE = 0x0020 , /* Work item finished execution */
28+ RT_WORK_STATE_CANCELED = 0x0040 , /* Work item canceled before execution */
29+ };
30+
31+ enum
32+ {
33+ RT_WORK_STATUS_IDLE = 0x0000 ,
34+ RT_WORK_STATUS_PENDING = RT_WORK_STATE_PENDING ,
35+ RT_WORK_STATUS_SUBMITTING = RT_WORK_STATE_SUBMITTING ,
36+ RT_WORK_STATUS_CANCELING = RT_WORK_STATE_CANCELING ,
37+ RT_WORK_STATUS_DONE = RT_WORK_STATE_DONE ,
38+ RT_WORK_STATUS_CANCELED = RT_WORK_STATE_CANCELED ,
39+ RT_WORK_STATUS_RUNNING = 0x0008 ,
40+ RT_WORK_STATUS_OTHER_QUEUE = 0x0010 ,
2641};
2742
2843/**
3348 RT_WORK_TYPE_DELAYED = 0x0001 ,
3449};
3550
51+ enum
52+ {
53+ RT_WORKQUEUE_FLAG_DESTROYING = 0x01 ,
54+ RT_WORKQUEUE_FLAG_SYNC_WAITING = 0x02 ,
55+ };
56+
3657/* workqueue implementation */
3758struct rt_workqueue
3859{
3960 rt_list_t work_list ;
4061 rt_list_t delayed_list ;
4162 struct rt_work * work_current ; /* current work */
42-
43- struct rt_semaphore sem ;
4463 rt_thread_t work_thread ;
4564 struct rt_spinlock spinlock ;
4665 struct rt_completion wakeup_completion ;
66+ struct rt_completion sync_completion ;
67+ rt_uint8_t flags ;
4768};
4869
4970struct rt_work
@@ -59,15 +80,14 @@ struct rt_work
5980};
6081
6182#ifdef RT_USING_HEAP
62- /**
63- * WorkQueue for DeviceDriver
64- */
6583void rt_work_init (struct rt_work * work , void (* work_func )(struct rt_work * work , void * work_data ), void * work_data );
6684struct rt_workqueue * rt_workqueue_create (const char * name , rt_uint16_t stack_size , rt_uint8_t priority );
6785rt_err_t rt_workqueue_destroy (struct rt_workqueue * queue );
86+ rt_err_t rt_workqueue_destroy_sync (struct rt_workqueue * queue );
6887rt_err_t rt_workqueue_dowork (struct rt_workqueue * queue , struct rt_work * work );
6988rt_err_t rt_workqueue_submit_work (struct rt_workqueue * queue , struct rt_work * work , rt_tick_t ticks );
7089rt_err_t rt_workqueue_cancel_work (struct rt_workqueue * queue , struct rt_work * work );
90+ rt_uint16_t rt_workqueue_get_work_status (struct rt_workqueue * queue , struct rt_work * work );
7191rt_err_t rt_workqueue_cancel_work_sync (struct rt_workqueue * queue , struct rt_work * work );
7292rt_err_t rt_workqueue_cancel_all_work (struct rt_workqueue * queue );
7393rt_err_t rt_workqueue_urgent_work (struct rt_workqueue * queue , struct rt_work * work );
@@ -76,6 +96,8 @@ rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *wo
7696rt_err_t rt_work_submit (struct rt_work * work , rt_tick_t ticks );
7797rt_err_t rt_work_urgent (struct rt_work * work );
7898rt_err_t rt_work_cancel (struct rt_work * work );
99+ rt_err_t rt_work_cancel_sync (struct rt_work * work );
100+ rt_uint16_t rt_work_get_status (struct rt_work * work );
79101#endif /* RT_USING_SYSTEM_WORKQUEUE */
80102
81103#ifdef __cplusplus
0 commit comments