sched/timer: remove critical section in setitimer

Signed-off-by: hujun5 <hujun5@xiaomi.com>
This commit is contained in:
hujun5 2025-01-19 10:56:31 +08:00 committed by Xiang Xiao
parent fcfc300f7a
commit 3193457dd0

View File

@ -134,9 +134,12 @@ void timer_deleteall(pid_t pid)
{
FAR struct posix_timer_s *timer;
FAR struct posix_timer_s *next;
sq_queue_t freetimers;
irqstate_t flags;
flags = enter_critical_section();
sq_init(&freetimers);
flags = spin_lock_irqsave(&g_locktimers);
for (timer = (FAR struct posix_timer_s *)g_alloctimers.head;
timer != NULL;
timer = next)
@ -144,11 +147,21 @@ void timer_deleteall(pid_t pid)
next = timer->flink;
if (timer->pt_owner == pid)
{
timer_delete((timer_t)timer);
sq_rem((FAR sq_entry_t *)timer, (FAR sq_queue_t *)&g_alloctimers);
sq_addlast((FAR sq_entry_t *)timer, (FAR sq_queue_t *)&freetimers);
}
}
leave_critical_section(flags);
spin_unlock_irqrestore(&g_locktimers, flags);
for (timer = (FAR struct posix_timer_s *)freetimers.head;
timer != NULL;
timer = next)
{
next = timer->flink;
sq_rem((FAR sq_entry_t *)timer, (FAR sq_queue_t *)&freetimers);
timer_release(timer);
}
}
/****************************************************************************