Author: davidxu
Date: Wed Oct 27 04:19:07 2010
New Revision: 214410
URL: http://svn.freebsd.org/changeset/base/214410

Log:
  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.

Modified:
  head/lib/libthr/thread/thr_mutex.c

Modified: head/lib/libthr/thread/thr_mutex.c
==============================================================================
--- head/lib/libthr/thread/thr_mutex.c  Wed Oct 27 02:32:54 2010        
(r214409)
+++ head/lib/libthr/thread/thr_mutex.c  Wed Oct 27 04:19:07 2010        
(r214410)
@@ -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 *
        } 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;
                }
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to