From 10b5aa8f59fa83f4f053fd2318cf5268544b3304 Mon Sep 17 00:00:00 2001 From: tangyuxin Date: Sat, 30 Jan 2021 18:29:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=20cancel=20=E5=92=8C=20cance?= =?UTF-8?q?l=5Fdelayed=20=E5=87=BD=E6=95=B0=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BD=93=E7=A7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 合并 _workqueue_cancel_work 和 _workqueue_cancel_delayed_work 函数,优化代码体积 --- components/drivers/src/workqueue.c | 58 +++++------------------------- 1 file changed, 9 insertions(+), 49 deletions(-) diff --git a/components/drivers/src/workqueue.c b/components/drivers/src/workqueue.c index 557f349e53..0c3c0e9f53 100644 --- a/components/drivers/src/workqueue.c +++ b/components/drivers/src/workqueue.c @@ -143,63 +143,23 @@ static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue, return -RT_ERROR; } -static rt_err_t _workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work) +static rt_err_t _workqueue_cancel_work(struct rt_work *work) { rt_base_t level; level = rt_hw_interrupt_disable(); - if (queue->work_current == work) - { - rt_hw_interrupt_enable(level); - return -RT_EBUSY; - } rt_list_remove(&(work->list)); work->flags &= ~RT_WORK_STATE_PENDING; - rt_hw_interrupt_enable(level); - - return RT_EOK; -} - -static rt_err_t _workqueue_cancel_delayed_work(struct rt_work *work) -{ - rt_base_t level; - int ret = RT_EOK; - - if (!work->workqueue) + /* Timer started */ + if (work->flags & RT_WORK_STATE_SUBMITTING) { - ret = -EINVAL; - goto __exit; + rt_timer_stop(&(work->timer)); + rt_timer_detach(&(work->timer)); + work->flags &= ~RT_WORK_STATE_SUBMITTING; } - - if (work->flags & RT_WORK_STATE_PENDING) - { - /* Remove from the queue if already submitted */ - ret = _workqueue_cancel_work(work->workqueue, work); - if (ret) - { - goto __exit; - } - } - else - { - if (work->flags & RT_WORK_STATE_SUBMITTING) - { - level = rt_hw_interrupt_disable(); - rt_timer_stop(&(work->timer)); - rt_timer_detach(&(work->timer)); - work->flags &= ~RT_WORK_STATE_SUBMITTING; - rt_hw_interrupt_enable(level); - } - } - - level = rt_hw_interrupt_disable(); - /* Detach from workqueue */ work->workqueue = RT_NULL; - work->flags &= ~(RT_WORK_STATE_PENDING); rt_hw_interrupt_enable(level); - -__exit: - return ret; + return 0; } static void _delayed_work_timeout_handler(void *parameter) @@ -317,11 +277,11 @@ rt_err_t rt_workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *wo if (work->type & RT_WORK_TYPE_DELAYED) { - return _workqueue_cancel_delayed_work(work); + return _workqueue_cancel_work(work); } else { - return _workqueue_cancel_work(queue, work); + return _workqueue_cancel_work(work); } }