From 7e4fc64d69e8211cbe6e6fed33998ecab29c873d Mon Sep 17 00:00:00 2001
From: OBATA Akio <obache@wizdas.com>
Date: Mon, 27 Dec 2021 17:29:50 +0900
Subject: tools: fix to use `pthread_t` for Thread ID

Thread ID is opaque type pthread_t, it may not be compatible with integer,
and may integer with valid id `0`.
Change to store mutex owner thread ID as `pthread_t` type with valid flag
and compare with `pthread_equal()`,

and don't try to print it.

Signed-off-by: OBATA Akio <obache@wizdas.com>
---
 src/tools/qmutex_unix.cpp | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/tools/qmutex_unix.cpp b/src/tools/qmutex_unix.cpp
index 6d1a1423d..dae1533c4 100644
--- a/src/tools/qmutex_unix.cpp
+++ b/src/tools/qmutex_unix.cpp
@@ -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 TQRealMutexPrivate::level()
 
 #ifndef    Q_RECURSIVE_MUTEX_TYPE
 TQRecursiveMutexPrivate::TQRecursiveMutexPrivate()
-    : count(0), owner(0)
+    : count(0), is_owned(false)
 {
     pthread_mutexattr_t attr;
     pthread_mutexattr_init(&attr);
@@ -244,14 +244,15 @@ void TQRecursiveMutexPrivate::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 TQRecursiveMutexPrivate::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 TQRecursiveMutexPrivate::unlock()
     } else {
 #ifdef QT_CHECK_RANGE
 	tqWarning("TQMutex::unlock: unlock from different thread than locker");
-	tqWarning("                was locked by %d, unlock attempt from %lu",
-		 (int)owner, (uintptr_t)pthread_self());
 #endif
     }
 
@@ -309,7 +308,7 @@ bool TQRecursiveMutexPrivate::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 TQRecursiveMutexPrivate::trylock()
 	    ret = FALSE;
 	} else {
 	    count = 1;
-	    owner = (unsigned long) pthread_self();
+	    owner = pthread_self();
+	    is_owned = true;
 	}
     }
 
-- 
cgit v1.2.3

