pthread: pthread_cond_wait dead lock
pthread_cond_wait is preempted after releasing the lock, sched_lock cannot lock threads from other CPUs, use enter_critical_section Signed-off-by: hujun5 <hujun5@xiaomi.com>
This commit is contained in:
parent
2be18a8b24
commit
0477fb116a
|
@ -58,6 +58,7 @@ int pthread_cond_wait(FAR pthread_cond_t *cond, FAR pthread_mutex_t *mutex)
|
|||
{
|
||||
int status;
|
||||
int ret;
|
||||
irqstate_t flags;
|
||||
|
||||
sinfo("cond=%p mutex=%p\n", cond, mutex);
|
||||
|
||||
|
@ -92,7 +93,7 @@ int pthread_cond_wait(FAR pthread_cond_t *cond, FAR pthread_mutex_t *mutex)
|
|||
|
||||
sinfo("Give up mutex / take cond\n");
|
||||
|
||||
sched_lock();
|
||||
flags = enter_critical_section();
|
||||
mutex->pid = INVALID_PROCESS_ID;
|
||||
#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
|
||||
mflags = mutex->flags;
|
||||
|
@ -115,7 +116,7 @@ int pthread_cond_wait(FAR pthread_cond_t *cond, FAR pthread_mutex_t *mutex)
|
|||
ret = status;
|
||||
}
|
||||
|
||||
sched_unlock();
|
||||
leave_critical_section(flags);
|
||||
|
||||
/* Reacquire the mutex.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue