@ -72,7 +72,6 @@ typedef pthread_mutex_t Q_MUTEX_T;
# include "qmutex_p.h"
# include <errno.h>
# include <stdint.h>
# include <string.h>
// Private class declarations
@ -106,7 +105,8 @@ public:
int level ( ) ;
int count ;
unsigned long owner ;
pthread_t owner ;
bool is_owned ;
pthread_mutex_t handle2 ;
} ;
# endif // !Q_RECURSIVE_MUTEX_TYPE
@ -207,7 +207,7 @@ int QRealMutexPrivate::level()
# ifndef Q_RECURSIVE_MUTEX_TYPE
QRecursiveMutexPrivate : : QRecursiveMutexPrivate ( )
: count ( 0 ) , owner( 0 )
: count ( 0 ) , is_owned( false )
{
pthread_mutexattr_t attr ;
pthread_mutexattr_init ( & attr ) ;
@ -244,14 +244,15 @@ void QRecursiveMutexPrivate::lock()
{
pthread_mutex_lock ( & handle2 ) ;
if ( count > 0 & & owner = = ( unsigned long ) pthread_self ( ) ) {
if ( count > 0 & & pthread_equal( owner , pthread_self ( ) ) ) {
count + + ;
} else {
pthread_mutex_unlock ( & handle2 ) ;
pthread_mutex_lock ( & handle ) ;
pthread_mutex_lock ( & handle2 ) ;
count = 1 ;
owner = ( unsigned long ) pthread_self ( ) ;
owner = pthread_self ( ) ;
is_owned = true ;
}
pthread_mutex_unlock ( & handle2 ) ;
@ -261,7 +262,7 @@ void QRecursiveMutexPrivate::unlock()
{
pthread_mutex_lock ( & handle2 ) ;
if ( owner = = ( unsigned long ) pthread_self ( ) ) {
if ( is_owned & & pthread_equal ( owner , pthread_self ( ) ) ) {
// do nothing if the count is already 0... to reflect the behaviour described
// in the docs
if ( count & & ( - - count ) < 1 ) {
@ -271,8 +272,6 @@ void QRecursiveMutexPrivate::unlock()
} else {
# ifdef QT_CHECK_RANGE
qWarning ( " QMutex::unlock: unlock from different thread than locker " ) ;
qWarning ( " was locked by %d, unlock attempt from %lu " ,
( int ) owner , ( uintptr_t ) pthread_self ( ) ) ;
# endif
}
@ -309,7 +308,7 @@ bool QRecursiveMutexPrivate::trylock()
pthread_mutex_lock ( & handle2 ) ;
if ( count > 0 & & owner = = ( unsigned long ) pthread_self ( ) ) {
if ( count > 0 & & pthread_equal( owner , pthread_self ( ) ) ) {
count + + ;
} else {
int code = pthread_mutex_trylock ( & handle ) ;
@ -323,7 +322,8 @@ bool QRecursiveMutexPrivate::trylock()
ret = FALSE ;
} else {
count = 1 ;
owner = ( unsigned long ) pthread_self ( ) ;
owner = pthread_self ( ) ;
is_owned = true ;
}
}