summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorguozhanxin <[email protected]>2023-02-16 20:19:26 +0800
committerMan, Jianting (Meco) <[email protected]>2023-02-16 20:59:14 -0500
commitb065486b23bd9c2cd8d9e58e4daac3fb47dea7ed (patch)
tree7d91ae7de07c3ae1d2e6ac58e62fe8fdfe5c47c3 /components
parentbc385cd55cad248c6965545470e5dc1ff6a6f87e (diff)
[workqueue] Reduce critical section, improve performance
Diffstat (limited to 'components')
-rw-r--r--components/drivers/ipc/workqueue.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/components/drivers/ipc/workqueue.c b/components/drivers/ipc/workqueue.c
index d9b98929c8..c70a1e1e28 100644
--- a/components/drivers/ipc/workqueue.c
+++ b/components/drivers/ipc/workqueue.c
@@ -93,30 +93,22 @@ static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue,
struct rt_work *work, rt_tick_t ticks)
{
rt_base_t level;
- rt_err_t err;
level = rt_hw_interrupt_disable();
+
/* remove list */
rt_list_remove(&(work->list));
work->flags &= ~RT_WORK_STATE_PENDING;
if (ticks == 0)
{
- if (queue->work_current != work)
- {
- rt_list_insert_after(queue->work_list.prev, &(work->list));
- work->flags |= RT_WORK_STATE_PENDING;
- work->workqueue = queue;
- err = RT_EOK;
- }
- else
- {
- err = -RT_EBUSY;
- }
+ rt_list_insert_after(queue->work_list.prev, &(work->list));
+ work->flags |= RT_WORK_STATE_PENDING;
+ work->workqueue = queue;
/* whether the workqueue is doing work */
if (queue->work_current == RT_NULL &&
- ((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_STAT_MASK))
+ ((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
{
/* resume work thread */
rt_thread_resume(queue->work_thread);
@@ -127,7 +119,7 @@ static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue,
{
rt_hw_interrupt_enable(level);
}
- return err;
+ return RT_EOK;
}
else if (ticks < RT_TICK_MAX / 2)
{
@@ -198,7 +190,7 @@ static void _delayed_work_timeout_handler(void *parameter)
}
/* whether the workqueue is doing work */
if (queue->work_current == RT_NULL &&
- ((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_STAT_MASK))
+ ((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
{
/* resume work thread */
rt_thread_resume(queue->work_thread);
@@ -356,7 +348,7 @@ rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *wo
rt_list_insert_after(&queue->work_list, &(work->list));
/* whether the workqueue is doing work */
if (queue->work_current == RT_NULL &&
- ((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_STAT_MASK))
+ ((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
{
/* resume work thread */
rt_thread_resume(queue->work_thread);