--- thread.c	2025/07/09 16:13:43	5.5
+++ thread.c	2025/08/08 21:07:22
@@ -155,8 +155,23 @@
 
 // --- cRwLock ---------------------------------------------------------------
 
+#define MAX_LOCK_TIME 60 // seconds
+
+static void CheckLockTime(time_t &t)
+{
+  if (t > 0) {
+     int d = time(NULL) - t;
+     if (d > MAX_LOCK_TIME) {
+        esyslog("ERROR: lock kept too long (%d seconds)", d);
+        cBackTrace::BackTrace();
+        }
+     }
+  t = 0;
+}
+
 cRwLock::cRwLock(bool PreferWriter)
 {
+  lockTime = 0;
   locked = 0;
   writeLockThreadId = 0;
   pthread_rwlockattr_t attr;
@@ -167,6 +182,7 @@
 
 cRwLock::~cRwLock()
 {
+  CheckLockTime(lockTime);
   pthread_rwlock_destroy(&rwlock);
 }
 
@@ -180,15 +196,20 @@
      }
   if (Write) {
      Result = TimeoutMs ? pthread_rwlock_timedwrlock(&rwlock, &abstime) : pthread_rwlock_wrlock(&rwlock);
-     if (Result == 0)
+     if (Result == 0) {
         writeLockThreadId = cThread::ThreadId();
+        lockTime = time(NULL);
+        }
      }
   else if (writeLockThreadId == cThread::ThreadId()) {
      locked++; // there can be any number of stacked read locks, so we keep track here
      Result = 0; // acquiring a read lock while holding a write lock within the same thread is OK
      }
-  else
+  else {
      Result = TimeoutMs ? pthread_rwlock_timedrdlock(&rwlock, &abstime) : pthread_rwlock_rdlock(&rwlock);
+     if (Result == 0)
+        lockTime = time(NULL);
+     }
   return Result == 0;
 }
 
@@ -201,6 +222,7 @@
         }
      }
   writeLockThreadId = 0;
+  CheckLockTime(lockTime);
   pthread_rwlock_unlock(&rwlock);
 }
 
@@ -208,6 +230,7 @@
 
 cMutex::cMutex(void)
 {
+  lockTime = 0;
   locked = 0;
   pthread_mutexattr_t attr;
   pthread_mutexattr_init(&attr);
@@ -217,19 +240,24 @@
 
 cMutex::~cMutex()
 {
+  CheckLockTime(lockTime);
   pthread_mutex_destroy(&mutex);
 }
 
 void cMutex::Lock(void)
 {
+  if (locked == 0)
+     lockTime = time(NULL);
   pthread_mutex_lock(&mutex);
   locked++;
 }
 
 void cMutex::Unlock(void)
 {
-  if (!--locked)
+  if (!--locked) {
+     CheckLockTime(lockTime);
      pthread_mutex_unlock(&mutex);
+     }
 }
 
 // --- cThread ---------------------------------------------------------------
--- thread.h	2025/03/02 11:03:35	5.0
+++ thread.h	2025/08/08 11:59:22
@@ -54,6 +54,7 @@
 
 class cRwLock {
 private:
+  time_t lockTime;
   pthread_rwlock_t rwlock;
   int locked;
   tThreadId writeLockThreadId;
@@ -67,6 +68,7 @@
 class cMutex {
   friend class cCondVar;
 private:
+  time_t lockTime;
   pthread_mutex_t mutex;
   int locked;
 public:
