Don't drop processor references with process-lock

_processors = new_list; may drop the last shared-ptr reference.
This may deadlock in ~IO() for I/O processors or plugins with sidechain
inputs. It's been mostly a non-issues since the GUI usually holds a last
shared-ptr reference for a processor to be deleted, but that is
not always the case.
This commit is contained in:
Robin Gareus 2017-07-07 23:05:59 +02:00
parent 75dea5bdc0
commit 60df2a342c

View File

@ -1236,6 +1236,7 @@ Route::clear_processors (Placement p)
_session.set_deletion_in_progress();
}
ProcessorList old_list = _processors;
{
Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
@ -1284,6 +1285,8 @@ Route::clear_processors (Placement p)
_processors = new_list;
configure_processors_unlocked (&err, &lm); // this can't fail
}
/* drop references w/o process-lock (I/O procs may re-take it in ~IO() */
old_list.clear ();
processor_max_streams.reset();
_have_internal_generator = false;
@ -2910,6 +2913,7 @@ Route::set_processor_state (const XMLNode& node)
}
}
ProcessorList old_list = _processors; // keep a copy
{
Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
@ -2939,6 +2943,8 @@ Route::set_processor_state (const XMLNode& node)
}
}
}
/* drop references w/o process-lock (I/O procs may re-take it in ~IO() */
old_list.clear ();
reset_instrument_info ();
processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */