wqueue: teardown should cancel the work already in wqueue

Signed-off-by: ligd <liguiding1@xiaomi.com>
This commit is contained in:
ligd 2024-09-10 20:43:42 +08:00 committed by Xiang Xiao
parent 42b6dd0ff1
commit 4d6203d4c6

View File

@ -168,6 +168,10 @@ static void work_notifier_worker(FAR void *arg)
flags = enter_critical_section(); flags = enter_critical_section();
/* Remove the notification from the pending list */
dq_rem((FAR dq_entry_t *)notifier, &g_notifier_pending);
/* Put the notification to the free list */ /* Put the notification to the free list */
dq_addlast((FAR dq_entry_t *)notifier, &g_notifier_free); dq_addlast((FAR dq_entry_t *)notifier, &g_notifier_free);
@ -298,13 +302,18 @@ void work_notifier_teardown(int key)
notifier = work_notifier_find(key); notifier = work_notifier_find(key);
if (notifier != NULL) if (notifier != NULL)
{ {
/* Found it! Remove the notification from the pending list */ /* Cancel the work, this may be waiting */
dq_rem((FAR dq_entry_t *)notifier, &g_notifier_pending); if (work_cancel_sync(notifier->info.qid, &notifier->work) != 1)
{
/* Remove the notification from the pending list */
/* Put the notification to the free list */ dq_rem((FAR dq_entry_t *)notifier, &g_notifier_pending);
dq_addlast((FAR dq_entry_t *)notifier, &g_notifier_free); /* Put the notification to the free list */
dq_addlast((FAR dq_entry_t *)notifier, &g_notifier_free);
}
} }
leave_critical_section(flags); leave_critical_section(flags);
@ -373,9 +382,9 @@ void work_notifier_signal(enum work_evtype_e evtype,
if (info->evtype == evtype && info->qualifier == qualifier) if (info->evtype == evtype && info->qualifier == qualifier)
{ {
/* Yes.. Remove the notification from the pending list */ /* Mark the notification as no longer pending */
dq_rem((FAR dq_entry_t *)notifier, &g_notifier_pending); info->qualifier = NULL;
/* Schedule the work. The entire notifier entry is passed as an /* Schedule the work. The entire notifier entry is passed as an
* argument to the work function because that function is * argument to the work function because that function is