From 6b4fe05fc06ba997d1a3655f212fde5c3eb1f167 Mon Sep 17 00:00:00 2001 From: Hayodea Hekol Date: Mon, 29 Sep 2025 12:58:41 -0400 Subject: [PATCH] Qutex: Add gridlock detection wireframing This is the basic wireframing required to enable us to detect gridlocks among requests. --- include/serializedAsynchronousContinuation.h | 17 ++++++++++++++--- smocore/serializedAsynchronousContinuation.cpp | 11 +++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/include/serializedAsynchronousContinuation.h b/include/serializedAsynchronousContinuation.h index e89730d..33c556e 100644 --- a/include/serializedAsynchronousContinuation.h +++ b/include/serializedAsynchronousContinuation.h @@ -99,13 +99,16 @@ public: Qutex *firstFailedQutexPtr = nullptr; bool deadlockLikely = isDeadlockLikely(); + bool gridlockLikely = isGridlockLikely(); if (!serializedContinuation.requiredLocks.tryAcquireOrBackOff( - *this, (deadlockLikely ? &firstFailedQutexPtr : nullptr))) + *this, + ((deadlockLikely || gridlockLikely) + ? &firstFailedQutexPtr : nullptr))) { // Just allow this lockvoker to be dropped from its io_service. allowAwakening(); - if (!deadlockLikely) + if (!deadlockLikely && !gridlockLikely) { return; } #ifdef CONFIG_ENABLE_DEBUG_LOCKS @@ -113,7 +116,10 @@ public: bool isDeadlock = traceContinuationHistoryForDeadlockOn( firstFailedQutex); - if (!isDeadlock) + bool isGridlock = traceContinuationHistoryForGridlockOn( + firstFailedQutex); + + if (!isDeadlock && !isGridlock) { return; } handleDeadlock(firstFailedQutex); @@ -202,8 +208,13 @@ public: #endif } + // Wrapper around isDeadlockLikely for gridlock detection + bool isGridlockLikely() const + { return isDeadlockLikely(); } + #ifdef CONFIG_ENABLE_DEBUG_LOCKS bool traceContinuationHistoryForDeadlockOn(Qutex &firstFailedQutex); + bool traceContinuationHistoryForGridlockOn(Qutex &firstFailedQutex); bool traceContinuationHistoryForDeadlock(void) { for (auto& lockUsageDesc diff --git a/smocore/serializedAsynchronousContinuation.cpp b/smocore/serializedAsynchronousContinuation.cpp index 19ffdea..69f9c5a 100644 --- a/smocore/serializedAsynchronousContinuation.cpp +++ b/smocore/serializedAsynchronousContinuation.cpp @@ -57,6 +57,17 @@ SerializedAsynchronousContinuation return false; } +template +template +bool +SerializedAsynchronousContinuation +::LockerAndInvoker +::traceContinuationHistoryForGridlockOn(Qutex &firstFailedQutex) +{ + // Empty implementation - to be filled in later + return false; +} + template template void