* dbus/dbus-sysdeps-pthread.c (_dbus_pthread_mutex_lock,
authorThiago Macieira <thiago@kde.org>
Sun, 19 Nov 2006 18:23:27 +0000 (18:23 +0000)
committerThiago Macieira <thiago@kde.org>
Sun, 19 Nov 2006 18:23:27 +0000 (18:23 +0000)
        _dbus_pthread_condvar_wait,
        _dbus_pthread_condvar_wait_timeout): set pmutex->holder to
        pthread_self() after coming back from a conditional variable
        wait as well as in one codepath where it was forgotten.
Approved by: Havoc Pennington.

ChangeLog
dbus/dbus-sysdeps-pthread.c

index a36a23a..dae3f5f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-11-19  Thiago Macieira  <thiago@kde.org>
+
+       * dbus/dbus-sysdeps-pthread.c (_dbus_pthread_mutex_lock,
+        _dbus_pthread_condvar_wait,
+        _dbus_pthread_condvar_wait_timeout): set pmutex->holder to
+        pthread_self() after coming back from a conditional variable
+        wait as well as in one codepath where it was forgotten.
+       Approved by: Havoc Pennington.
+
 2006-11-17  Havoc Pennington  <hp@redhat.com>
 
        * update-dbus-docs.sh: allow setting fd.org username via env
index 2f33b1c..55d3ea2 100644 (file)
@@ -153,6 +153,7 @@ _dbus_pthread_mutex_lock (DBusMutex *mutex)
         {
           /* Wait for the lock */
           PTHREAD_CHECK ("pthread_mutex_lock", pthread_mutex_lock (&pmutex->lock));
+         pmutex->holder = self;
           _dbus_assert (pmutex->count == 0);
         }
 
@@ -222,10 +223,11 @@ _dbus_pthread_condvar_wait (DBusCondVar *cond,
   _dbus_assert (pthread_equal (pmutex->holder, pthread_self ()));
 
   old_count = pmutex->count;
-  pmutex->count = 0;
+  pmutex->count = 0;           /* allow other threads to lock */
   PTHREAD_CHECK ("pthread_cond_wait", pthread_cond_wait (&pcond->cond, &pmutex->lock));
   _dbus_assert (pmutex->count == 0);
   pmutex->count = old_count;
+  pmutex->holder = pthread_self(); /* other threads may have locked the mutex in the meantime */
 }
 
 static dbus_bool_t
@@ -264,6 +266,7 @@ _dbus_pthread_condvar_wait_timeout (DBusCondVar               *cond,
 
   _dbus_assert (pmutex->count == 0);
   pmutex->count = old_count;
+  pmutex->holder = pthread_self(); /* other threads may have locked the mutex in the meantime */
   
   /* return true if we did not time out */
   return result != ETIMEDOUT;