summaryrefslogtreecommitdiff
path: root/libs/ardour/route.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-01-12 21:47:15 +0100
committerPaul Davis <paul@linuxaudiosystems.com>2014-01-13 09:39:18 -0500
commitac8eb0581da2e7ef7faceba4947c393496d3a530 (patch)
tree990e136de7e21627f6e8768dcb35324683f2b2de /libs/ardour/route.cc
parentac8e258e15035fc44ed857d3424f560f0b317326 (diff)
take process lock when adding processors:
fixes possible crash if a processor modifies port-count 1. a processor is inserted and activated with processor-lock held 2. only after that the process_lock() is taken, configure_processors() is called which reconfigures-IO BUT if the processor that is inserted changes the channel count AND audio is processed before IOs are reconfigured -> possible crash (invalid port-buffers) To reproduce: Bus1 (2in, 3out), Bus2 (2in, 3out) - add a send from Bus1 to Bus2, - then add a processor to Bus1, just before the send which increases the channel-count to 4 -> occasional crash or assert.
Diffstat (limited to 'libs/ardour/route.cc')
-rw-r--r--libs/ardour/route.cc6
1 files changed, 3 insertions, 3 deletions
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 4b9285c1c8..4171a9b239 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -947,6 +947,7 @@ Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<
{
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
ProcessorState pstate (this);
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
boost::shared_ptr<PluginInsert> pi;
boost::shared_ptr<PortInsert> porti;
@@ -986,8 +987,6 @@ Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<
// configure redirect ports properly, etc.
{
- Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
-
if (configure_processors_unlocked (err)) {
pstate.restore ();
configure_processors_unlocked (0); // it worked before we tried to add it ...
@@ -1117,6 +1116,7 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor>
{
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
ProcessorState pstate (this);
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
@@ -1137,8 +1137,8 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor>
(*i)->activate ();
}
+ /* Think: does this really need to be called for every processor in the loop? */
{
- Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
if (configure_processors_unlocked (err)) {
pstate.restore ();
configure_processors_unlocked (0); // it worked before we tried to add it ...