@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