pthread_mutex_destroy(): Fix an error in destorynig a mutex which can occur after a pthread has been canceled while holding the mutex.

This commit is contained in:
Gregory Nutt 2016-12-09 16:53:29 -06:00
parent 8b81cf5c7e
commit b07964461e
1 changed files with 25 additions and 2 deletions

View File

@ -41,6 +41,7 @@
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sched.h>
#include <errno.h>
#include <debug.h>
@ -90,7 +91,29 @@ int pthread_mutex_destroy(FAR pthread_mutex_t *mutex)
if (mutex->pid != -1)
{
ret = EBUSY;
#ifndef CONFIG_DISABLE_SIGNALS
/* Verify that the PID still exists. We may be destroying the
* mutex after cancelling a pthread and the mutex may have been
* in a bad state owned by the dead pthread.
*/
ret = kill(mutex->pid, 0);
if (ret < 0)
{
/* That thread associated with the PID no longer exists */
mutex->pid = -1;
/* Destroy the semaphore */
status = sem_destroy((FAR sem_t *)&mutex->sem);
ret = (status != OK) ? get_errno() : OK;
}
else
#endif
{
ret = EBUSY;
}
}
else
{
@ -99,7 +122,7 @@ int pthread_mutex_destroy(FAR pthread_mutex_t *mutex)
status = sem_destroy((FAR sem_t *)&mutex->sem);
if (status != OK)
{
ret = EINVAL;
ret = get_errno();
}
}