diff options
| author | guozhanxin <[email protected]> | 2023-02-16 20:19:26 +0800 |
|---|---|---|
| committer | Man, Jianting (Meco) <[email protected]> | 2023-02-16 20:59:14 -0500 |
| commit | b065486b23bd9c2cd8d9e58e4daac3fb47dea7ed (patch) | |
| tree | 7d91ae7de07c3ae1d2e6ac58e62fe8fdfe5c47c3 /components | |
| parent | bc385cd55cad248c6965545470e5dc1ff6a6f87e (diff) | |
[workqueue] Reduce critical section, improve performance
Diffstat (limited to 'components')
| -rw-r--r-- | components/drivers/ipc/workqueue.c | 24 |
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); |
