Skip to content

Commit cbde6dd

Browse files
committed
[components][ipc][workqueue] 完善 workqueue 同步语义、生命周期收敛与 delayed 队列处理
1 parent 6a635e3 commit cbde6dd

File tree

7 files changed

+4294
-838
lines changed

7 files changed

+4294
-838
lines changed

components/drivers/include/ipc/workqueue.h

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
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__
@@ -23,6 +24,21 @@ enum
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
/**
@@ -33,17 +49,23 @@ enum
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 */
3759
struct 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

4971
struct rt_work
@@ -59,15 +81,14 @@ struct rt_work
5981
};
6082

6183
#ifdef RT_USING_HEAP
62-
/**
63-
* WorkQueue for DeviceDriver
64-
*/
6584
void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data), void *work_data);
6685
struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority);
6786
rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue);
87+
rt_err_t rt_workqueue_destroy_sync(struct rt_workqueue *queue);
6888
rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work);
6989
rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t ticks);
7090
rt_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);
7192
rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work);
7293
rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue);
7394
rt_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
7697
rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t ticks);
7798
rt_err_t rt_work_urgent(struct rt_work *work);
7899
rt_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

components/drivers/ipc/utest/SConscript

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ if GetDepend(['RT_UTEST_COMPLETION']):
99
src += ['completion_tc.c', 'completion_timeout_tc.c']
1010

1111
if GetDepend(['RT_UTEST_WORKQUEUE']):
12-
src += ['workqueue_tc.c']
12+
src += ['workqueue_tc_basic.c', 'workqueue_tc_cancel.c', 'workqueue_tc_destroy.c']
1313

1414
group = DefineGroup('utestcases', src, depend = ['RT_USING_UTESTCASES'], CPPPATH = CPPPATH)
1515

0 commit comments

Comments
 (0)