@Christoph-Hart Does this look right? It's throwing a bunch of errors.
void MessageManager::Lock::exit() const noexcept { if (blockingMessage != nullptr) { { ScopedLock lock(blockingMessage->ownerCriticalSection); blockingMessage->owner.set(nullptr); } blockingMessage->releaseEvent.signal(); blockingMessage = nullptr; } const ScopeGuard scope{ [&] { blockingMessage = nullptr; } }; blockingMessage->stopWaiting(); if (!blockingMessage->wasAcquired()) return; if (auto* mm = MessageManager::instance) { jassert(mm->currentThreadHasLockedMessageManager()); mm->threadWithLock = {}; } }EDIT: operator error. This works:
void MessageManager::Lock::exit() const noexcept { if (lockGained.compareAndSetBool (false, true)) { auto* mm = MessageManager::instance; jassert (mm == nullptr || mm->currentThreadHasLockedMessageManager()); lockGained.set (0); if (mm != nullptr) mm->threadWithLock = {}; if (blockingMessage != nullptr) { { ScopedLock lock(blockingMessage->ownerCriticalSection); blockingMessage->owner.set(nullptr); } blockingMessage->releaseEvent.signal(); blockingMessage = nullptr; } } }Testing now