Remove locking and unlock in pthread_mutex_destroy, because

it can not fix race condition in application code, as a result,
the problem described in PR threads/151767 is avoided.
This commit is contained in:
David Xu 2010-10-27 04:19:07 +00:00
parent 1676b42546
commit e96b4de80e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=214410

View File

@ -257,10 +257,8 @@ _mutex_fork(struct pthread *curthread)
int
_pthread_mutex_destroy(pthread_mutex_t *mutex)
{
struct pthread *curthread = _get_curthread();
pthread_mutex_t m;
uint32_t id;
int ret = 0;
int ret;
m = *mutex;
if (m < THR_MUTEX_DESTROYED) {
@ -268,34 +266,13 @@ _pthread_mutex_destroy(pthread_mutex_t *mutex)
} else if (m == THR_MUTEX_DESTROYED) {
ret = EINVAL;
} else {
id = TID(curthread);
/*
* Try to lock the mutex structure, we only need to
* try once, if failed, the mutex is in used.
*/
ret = _thr_umutex_trylock(&m->m_lock, id);
if (ret)
return (ret);
/*
* Check mutex other fields to see if this mutex is
* in use. Mostly for prority mutex types, or there
* are condition variables referencing it.
*/
if (m->m_owner != NULL || m->m_refcount != 0) {
if (m->m_lock.m_flags & UMUTEX_PRIO_PROTECT)
set_inherited_priority(curthread, m);
_thr_umutex_unlock(&m->m_lock, id);
ret = EBUSY;
} else {
*mutex = THR_MUTEX_DESTROYED;
if (m->m_lock.m_flags & UMUTEX_PRIO_PROTECT)
set_inherited_priority(curthread, m);
_thr_umutex_unlock(&m->m_lock, id);
MUTEX_ASSERT_NOT_OWNED(m);
free(m);
ret = 0;
}
}