mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-10 04:30:12 +02:00
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:
@@ -347,8 +347,8 @@ class Vst3Bridge : public HostBridge {
|
|||||||
// `mutual_recursion_contexts` will be blocked until the deeper calls
|
// `mutual_recursion_contexts` will be blocked until the deeper calls
|
||||||
// are finished.
|
// are finished.
|
||||||
{
|
{
|
||||||
if (std::lock_guard lock(mutual_recursion_contexts_mutex);
|
std::lock_guard lock(mutual_recursion_contexts_mutex);
|
||||||
!mutual_recursion_contexts.empty()) {
|
if (!mutual_recursion_contexts.empty()) {
|
||||||
boost::asio::dispatch(*mutual_recursion_contexts.back(),
|
boost::asio::dispatch(*mutual_recursion_contexts.back(),
|
||||||
std::move(do_call));
|
std::move(do_call));
|
||||||
} else {
|
} else {
|
||||||
@@ -370,11 +370,15 @@ class Vst3Bridge : public HostBridge {
|
|||||||
std::packaged_task<T()> do_call(std::move(f));
|
std::packaged_task<T()> do_call(std::move(f));
|
||||||
std::future<T> do_call_response = do_call.get_future();
|
std::future<T> do_call_response = do_call.get_future();
|
||||||
|
|
||||||
if (std::lock_guard lock(mutual_recursion_contexts_mutex);
|
std::unique_lock lock(mutual_recursion_contexts_mutex);
|
||||||
!mutual_recursion_contexts.empty()) {
|
if (!mutual_recursion_contexts.empty()) {
|
||||||
boost::asio::dispatch(*mutual_recursion_contexts.back(),
|
boost::asio::dispatch(*mutual_recursion_contexts.back(),
|
||||||
std::move(do_call));
|
std::move(do_call));
|
||||||
} else {
|
} else {
|
||||||
|
// Unlike the other branches in the `do_mutual_recursion_*`
|
||||||
|
// functions, this one will block
|
||||||
|
lock.unlock();
|
||||||
|
|
||||||
do_call();
|
do_call();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user