Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 29 additions & 6 deletions components/drivers/include/ipc/workqueue.h
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
/*
* Copyright (c) 2006-2023, RT-Thread Development Team
* Copyright (c) 2006-2026, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-08-01 Meco Man remove rt_delayed_work_init() and rt_delayed_work structure
* 2021-08-14 Jackistang add comments for rt_work_init()
* 2026-03-21 RyanCW(Codex) refine sync/status workqueue APIs
*/
#ifndef WORKQUEUE_H__
#define WORKQUEUE_H__
Expand All @@ -23,6 +24,21 @@ enum
{
RT_WORK_STATE_PENDING = 0x0001, /* Work item pending state */
RT_WORK_STATE_SUBMITTING = 0x0002, /* Work item submitting state */
RT_WORK_STATE_CANCELING = 0x0004, /* Work item canceling state */
RT_WORK_STATE_DONE = 0x0020, /* Work item finished execution */
RT_WORK_STATE_CANCELED = 0x0040, /* Work item canceled before execution */
};

enum
{
RT_WORK_STATUS_IDLE = 0x0000,
RT_WORK_STATUS_PENDING = RT_WORK_STATE_PENDING,
RT_WORK_STATUS_SUBMITTING = RT_WORK_STATE_SUBMITTING,
RT_WORK_STATUS_CANCELING = RT_WORK_STATE_CANCELING,
RT_WORK_STATUS_DONE = RT_WORK_STATE_DONE,
RT_WORK_STATUS_CANCELED = RT_WORK_STATE_CANCELED,
RT_WORK_STATUS_RUNNING = 0x0008,
RT_WORK_STATUS_OTHER_QUEUE = 0x0010,
};

/**
Expand All @@ -33,17 +49,23 @@ enum
RT_WORK_TYPE_DELAYED = 0x0001,
};

enum
{
RT_WORKQUEUE_FLAG_DESTROYING = 0x01,
RT_WORKQUEUE_FLAG_SYNC_WAITING = 0x02,
};

/* workqueue implementation */
struct rt_workqueue
{
rt_list_t work_list;
rt_list_t delayed_list;
struct rt_work *work_current; /* current work */

struct rt_semaphore sem;
rt_thread_t work_thread;
struct rt_spinlock spinlock;
struct rt_completion wakeup_completion;
struct rt_completion sync_completion;
rt_uint8_t flags;
};

struct rt_work
Expand All @@ -59,15 +81,14 @@ struct rt_work
};

#ifdef RT_USING_HEAP
/**
* WorkQueue for DeviceDriver
*/
void rt_work_init(struct rt_work *work, void (*work_func)(struct rt_work *work, void *work_data), void *work_data);
struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority);
rt_err_t rt_workqueue_destroy(struct rt_workqueue *queue);
rt_err_t rt_workqueue_destroy_sync(struct rt_workqueue *queue);
rt_err_t rt_workqueue_dowork(struct rt_workqueue *queue, struct rt_work *work);
rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *work, rt_tick_t ticks);
rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work);
rt_uint16_t rt_workqueue_get_work_status(struct rt_workqueue *queue, struct rt_work *work);
rt_err_t rt_workqueue_cancel_work_sync(struct rt_workqueue *queue, struct rt_work *work);
rt_err_t rt_workqueue_cancel_all_work(struct rt_workqueue *queue);
rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *work);
Expand All @@ -76,6 +97,8 @@ rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *wo
rt_err_t rt_work_submit(struct rt_work *work, rt_tick_t ticks);
rt_err_t rt_work_urgent(struct rt_work *work);
rt_err_t rt_work_cancel(struct rt_work *work);
rt_err_t rt_work_cancel_sync(struct rt_work *work);
rt_uint16_t rt_work_get_status(struct rt_work *work);
#endif /* RT_USING_SYSTEM_WORKQUEUE */

#ifdef __cplusplus
Expand Down
2 changes: 1 addition & 1 deletion components/drivers/ipc/utest/SConscript
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ if GetDepend(['RT_UTEST_COMPLETION']):
src += ['completion_tc.c', 'completion_timeout_tc.c']

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

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

Expand Down
Loading
Loading