From 83dca09e1c31637583b99823c86ed86fa3e12491 Mon Sep 17 00:00:00 2001 From: tangyuxin <462747508@qq.com> Date: Sat, 6 Feb 2021 21:54:25 +0800 Subject: [workqueue] 修复提交工作后立即取消,获取无效工作任务的问题 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当高优先级任务提交工作后,立即取消。此时队列被唤醒,下面紧接着获取链表中第一个任务。但此时已经是空链表了。 每次线程被唤醒。检查当前任务链表是否未空 --- components/drivers/src/workqueue.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components') diff --git a/components/drivers/src/workqueue.c b/components/drivers/src/workqueue.c index 3feeaea0be..ce1ca071c3 100644 --- a/components/drivers/src/workqueue.c +++ b/components/drivers/src/workqueue.c @@ -58,15 +58,17 @@ static void _workqueue_thread_entry(void *parameter) while (1) { + level = rt_hw_interrupt_disable(); if (rt_list_isempty(&(queue->work_list))) { + rt_hw_interrupt_enable(level); /* no software timer exist, suspend self. */ rt_thread_suspend(rt_thread_self()); rt_schedule(); + continue; } /* we have work to do with. */ - level = rt_hw_interrupt_disable(); work = rt_list_entry(queue->work_list.next, struct rt_work, list); rt_list_remove(&(work->list)); queue->work_current = work; @@ -76,10 +78,8 @@ static void _workqueue_thread_entry(void *parameter) /* do work */ work->work_func(work, work->work_data); - level = rt_hw_interrupt_disable(); /* clean current work */ queue->work_current = RT_NULL; - rt_hw_interrupt_enable(level); /* ack work completion */ _workqueue_work_completion(queue); -- cgit v1.3.1