diff --git a/smocore/qutex.cpp b/smocore/qutex.cpp index 68f81af..3fe5c88 100644 --- a/smocore/qutex.cpp +++ b/smocore/qutex.cpp @@ -295,14 +295,24 @@ void Qutex::release() { lock.acquire(); - isOwned = false; - /** FIXME: - * We need to be able to call this twice or more from the same request. - * We can either add further metadata to this class, or we can force all - * release() calls to be done via the Continuation object, such that it - * can ensure that it doesn't double-release any locks that were released - * early. + /** EXPLAINATION: + * A qutex must not have its release() called when it's not owned. The + * plumbing required to permit that is a bit excessive, and we have + * instrumentation to track early qutex release()ing in + * SerializedAsynchronousContinuation. */ + if (!isOwned +#ifdef CONFIG_ENABLE_DEBUG_LOCKS + || currOwner == nullptr +#endif + ) + { + throw std::runtime_error( + std::string(__func__) + + ": release() called on unowned qutex - this should never happen"); + } + + isOwned = false; #ifdef CONFIG_ENABLE_DEBUG_LOCKS currOwner = nullptr; #endif