mirror of https://github.com/RT-Thread/rt-thread
[pthreads] Fix pthread_cond_timedwait lacks timeout wakeup
This commit is contained in:
parent
d23006ea4f
commit
f9564d4ee0
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue