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 *
66 * Change Logs:
77 * Date Author Notes
88 * 2021-08-01 Meco Man remove rt_delayed_work_init() and rt_delayed_work structure
99 * 2021-08-14 Jackistang add comments for rt_work_init()
10+ * 2026-03-21 RyanCW(Codex) refine sync/status workqueue APIs
1011 */
1112#ifndef WORKQUEUE_H__
1213#define WORKQUEUE_H__
2324{
2425 RT_WORK_STATE_PENDING = 0x0001 , /* Work item pending state */
2526 RT_WORK_STATE_SUBMITTING = 0x0002 , /* Work item submitting state */
27+ RT_WORK_STATE_CANCELING = 0x0004 , /* Work item canceling state */
28+ RT_WORK_STATE_DONE = 0x0020 , /* Work item finished execution */
29+ RT_WORK_STATE_CANCELED = 0x0040 , /* Work item canceled before execution */
30+ };
31+
32+ enum
33+ {
34+ RT_WORK_STATUS_IDLE = 0x0000 ,
35+ RT_WORK_STATUS_PENDING = RT_WORK_STATE_PENDING ,
36+ RT_WORK_STATUS_SUBMITTING = RT_WORK_STATE_SUBMITTING ,
37+ RT_WORK_STATUS_CANCELING = RT_WORK_STATE_CANCELING ,
38+ RT_WORK_STATUS_DONE = RT_WORK_STATE_DONE ,
39+ RT_WORK_STATUS_CANCELED = RT_WORK_STATE_CANCELED ,
40+ RT_WORK_STATUS_RUNNING = 0x0008 ,
41+ RT_WORK_STATUS_OTHER_QUEUE = 0x0010 ,
2642};
2743
2844/**
3349 RT_WORK_TYPE_DELAYED = 0x0001 ,
3450};
3551
52+ enum
53+ {
54+ RT_WORKQUEUE_FLAG_DESTROYING = 0x01 ,
55+ RT_WORKQUEUE_FLAG_SYNC_WAITING = 0x02 ,
56+ };
57+
3658/* workqueue implementation */
3759struct rt_workqueue
3860{
3961 rt_list_t work_list ;
4062 rt_list_t delayed_list ;
4163 struct rt_work * work_current ; /* current work */
42-
43- struct rt_semaphore sem ;
4464 rt_thread_t work_thread ;
4565 struct rt_spinlock spinlock ;
4666 struct rt_completion wakeup_completion ;
67+ struct rt_completion sync_completion ;
68+ rt_uint8_t flags ;
4769};
4870
4971struct rt_work
@@ -59,15 +81,14 @@ struct rt_work
5981};
6082
6183#ifdef RT_USING_HEAP
62- /**
63- * WorkQueue for DeviceDriver
64- */
6584void rt_work_init (struct rt_work * work , void (* work_func )(struct rt_work * work , void * work_data ), void * work_data );
6685struct rt_workqueue * rt_workqueue_create (const char * name , rt_uint16_t stack_size , rt_uint8_t priority );
6786rt_err_t rt_workqueue_destroy (struct rt_workqueue * queue );
87+ rt_err_t rt_workqueue_destroy_sync (struct rt_workqueue * queue );
6888rt_err_t rt_workqueue_dowork (struct rt_workqueue * queue , struct rt_work * work );
6989rt_err_t rt_workqueue_submit_work (struct rt_workqueue * queue , struct rt_work * work , rt_tick_t ticks );
7090rt_err_t rt_workqueue_cancel_work (struct rt_workqueue * queue , struct rt_work * work );
91+ rt_uint16_t rt_workqueue_get_work_status (struct rt_workqueue * queue , struct rt_work * work );
7192rt_err_t rt_workqueue_cancel_work_sync (struct rt_workqueue * queue , struct rt_work * work );
7293rt_err_t rt_workqueue_cancel_all_work (struct rt_workqueue * queue );
7394rt_err_t rt_workqueue_urgent_work (struct rt_workqueue * queue , struct rt_work * work );
@@ -76,6 +97,8 @@ rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *wo
7697rt_err_t rt_work_submit (struct rt_work * work , rt_tick_t ticks );
7798rt_err_t rt_work_urgent (struct rt_work * work );
7899rt_err_t rt_work_cancel (struct rt_work * work );
100+ rt_err_t rt_work_cancel_sync (struct rt_work * work );
101+ rt_uint16_t rt_work_get_status (struct rt_work * work );
79102#endif /* RT_USING_SYSTEM_WORKQUEUE */
80103
81104#ifdef __cplusplus
0 commit comments