diff --git a/include/qutexAcquisitionHistoryTracker.h b/include/qutexAcquisitionHistoryTracker.h index bcefff9..e8b2270 100644 --- a/include/qutexAcquisitionHistoryTracker.h +++ b/include/qutexAcquisitionHistoryTracker.h @@ -106,7 +106,9 @@ public: } bool heuristicallyTraceContinuationHistoryForGridlockOn( - Qutex &firstFailedQutex) const; + Qutex &firstFailedQutex, + std::shared_ptr& currentContinuation) + const; bool completelyTraceContinuationHistoryForGridlockOn( Qutex &firstFailedQutex) const; diff --git a/include/serializedAsynchronousContinuation.h b/include/serializedAsynchronousContinuation.h index 93f2f8e..2c63ff8 100644 --- a/include/serializedAsynchronousContinuation.h +++ b/include/serializedAsynchronousContinuation.h @@ -134,13 +134,16 @@ public: .getAcquiredQutexHistory(); // Add this continuation to the tracker + auto currentContinuationShPtr = serializedContinuation + .shared_from_this(); + tracker.addIfNotExists( - serializedContinuation.shared_from_this(), + currentContinuationShPtr, firstFailedQutex, std::move(heldLocks)); gridlockIsHeuristicallyLikely = tracker .heuristicallyTraceContinuationHistoryForGridlockOn( - firstFailedQutex); + firstFailedQutex, currentContinuationShPtr); if (gridlockIsHeuristicallyLikely) { diff --git a/smocore/qutexAcquisitionHistoryTracker.cpp b/smocore/qutexAcquisitionHistoryTracker.cpp index ff78e55..7e2bc05 100644 --- a/smocore/qutexAcquisitionHistoryTracker.cpp +++ b/smocore/qutexAcquisitionHistoryTracker.cpp @@ -63,7 +63,9 @@ namespace smo { */ bool QutexAcquisitionHistoryTracker -::heuristicallyTraceContinuationHistoryForGridlockOn(Qutex &firstFailedQutex) +::heuristicallyTraceContinuationHistoryForGridlockOn( + Qutex &firstFailedQutex, + std::shared_ptr& currentContinuation) const { /** HEURISTIC APPROACH: @@ -80,6 +82,34 @@ const * explanation. */ + // Iterate through all entries in the acquisition history + for (const auto& entry : acquisitionHistory) { + const auto& continuation = entry.first; + const auto& historyEntry = entry.second; + + // Skip the current continuation (don't compare with itself) + if (continuation == currentContinuation) { + continue; + } + + // Check if firstFailedQutex is in this continuation's held locks + const std::unique_ptr>>& + heldLocks = historyEntry.second; + + if (!heldLocks) + { continue; } + + for (const auto& heldLock : *heldLocks) + { + /* Found firstFailedQutex in another continuation's held locks + * This indicates a potential gridlock + */ + if (&heldLock.get() == &firstFailedQutex) { + return true; + } + } + } + return false; }