[pthreads] Fix pthread_cond_timedwait lacks timeout wakeup

This commit is contained in:
ChenRuiwei 2025-07-07 14:35:05 +08:00 committed by Rbb666
parent d23006ea4f
commit f9564d4ee0
1 changed files with 5 additions and 11 deletions

View File

@ -367,30 +367,27 @@ rt_err_t _pthread_cond_timedwait(pthread_cond_t *cond,
} }
{ {
register rt_base_t temp;
struct rt_thread *thread; struct rt_thread *thread;
/* parameter check */ /* parameter check */
RT_ASSERT(sem != RT_NULL); RT_ASSERT(sem != RT_NULL);
RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore); RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore);
/* disable interrupt */ rt_enter_critical();
temp = rt_hw_interrupt_disable();
if (sem->value > 0) if (sem->value > 0)
{ {
/* semaphore is available */ /* semaphore is available */
sem->value--; sem->value--;
/* enable interrupt */ rt_exit_critical();
rt_hw_interrupt_enable(temp);
} }
else else
{ {
/* no waiting, return with timeout */ /* no waiting, return with timeout */
if (time == 0) if (time == 0)
{ {
rt_hw_interrupt_enable(temp); rt_exit_critical();
return -RT_ETIMEOUT; return -RT_ETIMEOUT;
} }
@ -434,11 +431,8 @@ rt_err_t _pthread_cond_timedwait(pthread_cond_t *cond,
return -RT_ERROR; return -RT_ERROR;
} }
/* enable interrupt */ /* exit critical and do schedule */
rt_hw_interrupt_enable(temp); rt_exit_critical();
/* do schedule */
rt_schedule();
result = thread->error; result = thread->error;