From 60df2a342c2f244d6b002692caa279c17dc5d26d Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 7 Jul 2017 23:05:59 +0200 Subject: [PATCH] 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. --- libs/ardour/route.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 63ac12a1cf..34c2b2f823 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -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 */