From 376b50a6ae020fd234216b2a3619391d47c38e67 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 13 Nov 2022 00:19:40 +0100 Subject: [PATCH] Fix concurrency issue when deactivating plugins Processor::deactivate must not be called concurrently with processing. e.g. Threading rules https://lv2plug.in/ns/lv2core This fixes a potential crash when freezing tracks --- libs/ardour/plugin_insert.cc | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 8b962ce4f3..d58a22b607 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -736,9 +736,7 @@ PluginInsert::deactivate () _timing_stats.reset (); Processor::deactivate (); - for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { - (*i)->deactivate (); - } + /* Plugin::deactivate is called from run() */ const samplecnt_t l = effective_latency (); if (_plugin_signal_latency != l) { @@ -1307,7 +1305,14 @@ PluginInsert::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sa _timing_stats.reset (); } - if (g_atomic_int_compare_and_exchange (&_flush, 1, 0)) { + if (_active != _pending_active && !_pending_active) { + /* deactivate */ + for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { + (*i)->deactivate (); + } + } + + if (check_active () && g_atomic_int_compare_and_exchange (&_flush, 1, 0)) { for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { (*i)->flush (); }