summaryrefslogtreecommitdiff
path: root/components/drivers/src/workqueue.c
diff options
context:
space:
mode:
Diffstat (limited to 'components/drivers/src/workqueue.c')
-rw-r--r--components/drivers/src/workqueue.c6
1 files changed, 3 insertions, 3 deletions
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);