diff options
| author | Shell <[email protected]> | 2024-02-23 17:49:15 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-02-23 17:49:15 +0800 |
| commit | 71560bafb5735220696ca24a42ba4a668b55949b (patch) | |
| tree | 236df5973a1fd5b6f0cc9f6c6b6a2d71fd069203 /components/drivers/ipc/workqueue.c | |
| parent | 6fe69d7431ed54fcea863ed68d7c4f9746e771b0 (diff) | |
🎯 Sync smart & scheduler codes (#8537)
Signed-off-by: Shell <[email protected]>
Co-authored-by: xqyjlj <[email protected]>
Diffstat (limited to 'components/drivers/ipc/workqueue.c')
| -rw-r--r-- | components/drivers/ipc/workqueue.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/components/drivers/ipc/workqueue.c b/components/drivers/ipc/workqueue.c index 3f191fb9e2..cb958c8710 100644 --- a/components/drivers/ipc/workqueue.c +++ b/components/drivers/ipc/workqueue.c @@ -64,7 +64,10 @@ static void _workqueue_thread_entry(void *parameter) { /* no software timer exist, suspend self. */ rt_thread_suspend_with_flag(rt_thread_self(), RT_UNINTERRUPTIBLE); + + /* release lock after suspend so we will not lost any wakeups */ rt_spin_unlock_irqrestore(&(queue->spinlock), level); + rt_schedule(); continue; } @@ -105,13 +108,11 @@ static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue, work->workqueue = queue; /* whether the workqueue is doing work */ - if (queue->work_current == RT_NULL && - ((queue->work_thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK)) + if (queue->work_current == RT_NULL) { - /* resume work thread */ + /* resume work thread, and do a re-schedule if succeed */ rt_thread_resume(queue->work_thread); rt_spin_unlock_irqrestore(&(queue->spinlock), level); - rt_schedule(); } else { @@ -187,13 +188,11 @@ static void _delayed_work_timeout_handler(void *parameter) work->flags |= RT_WORK_STATE_PENDING; } /* whether the workqueue is doing work */ - if (queue->work_current == RT_NULL && - ((queue->work_thread->stat & RT_THREAD_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK)) + if (queue->work_current == RT_NULL) { - /* resume work thread */ + /* resume work thread, and do a re-schedule if succeed */ rt_thread_resume(queue->work_thread); rt_spin_unlock_irqrestore(&(queue->spinlock), level); - rt_schedule(); } else { @@ -346,13 +345,11 @@ rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *wo rt_list_remove(&(work->list)); 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_SUSPEND_MASK) == RT_THREAD_SUSPEND_MASK)) + if (queue->work_current == RT_NULL) { - /* resume work thread */ + /* resume work thread, and do a re-schedule if succeed */ rt_thread_resume(queue->work_thread); rt_spin_unlock_irqrestore(&(queue->spinlock), level); - rt_schedule(); } else { |
