Skip to content

Commit e263fad

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

File tree

7 files changed

+4094
-838
lines changed

7 files changed

+4094
-838
lines changed

components/drivers/include/ipc/workqueue.h

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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
*
@@ -23,6 +23,21 @@ enum
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
/**
@@ -33,17 +48,23 @@ enum
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 */
3758
struct 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

4970
struct rt_work
@@ -59,15 +80,14 @@ struct rt_work
5980
};
6081

6182
#ifdef RT_USING_HEAP
62-
/**
63-
* WorkQueue for DeviceDriver
64-
*/
6583
void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data), void *work_data);
6684
struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority);
6785
rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue);
86+
rt_err_t rt_workqueue_destroy_sync(struct rt_workqueue *queue);
6887
rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work);
6988
rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t ticks);
7089
rt_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);
7191
rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work);
7292
rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue);
7393
rt_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
7696
rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t ticks);
7797
rt_err_t rt_work_urgent(struct rt_work *work);
7898
rt_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

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)