Fix deadlock caused by do_mutual_recursion_on_off_thread

Apparently the destructor for C++17/20 conditional initializers are only
run after the else branch, so this would keep the mutex locked while
executing `do_call()`.
This commit is contained in:
Robbert van der Helm
2021-05-01 21:01:47 +02:00
parent 459e7ac56b
commit f3f2bfdc24
+8 -4
View File
@@ -347,8 +347,8 @@ class Vst3Bridge : public HostBridge {
// `mutual_recursion_contexts` will be blocked until the deeper calls
// are finished.
{
if (std::lock_guard lock(mutual_recursion_contexts_mutex);
!mutual_recursion_contexts.empty()) {
std::lock_guard lock(mutual_recursion_contexts_mutex);
if (!mutual_recursion_contexts.empty()) {
boost::asio::dispatch(*mutual_recursion_contexts.back(),
std::move(do_call));
} else {
@@ -370,11 +370,15 @@ class Vst3Bridge : public HostBridge {
std::packaged_task<T()> do_call(std::move(f));
std::future<T> do_call_response = do_call.get_future();
if (std::lock_guard lock(mutual_recursion_contexts_mutex);
!mutual_recursion_contexts.empty()) {
std::unique_lock lock(mutual_recursion_contexts_mutex);
if (!mutual_recursion_contexts.empty()) {
boost::asio::dispatch(*mutual_recursion_contexts.back(),
std::move(do_call));
} else {
// Unlike the other branches in the `do_mutual_recursion_*`
// functions, this one will block
lock.unlock();
do_call();
}