mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-06 21:55:43 +01:00
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:
parent
75dea5bdc0
commit
60df2a342c
1 changed files with 6 additions and 0 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue