RTA: fix potential invalidated iterator when clearing RTA

This commit is contained in:
Robin Gareus 2025-08-26 18:11:03 +02:00 committed by Edgar Aichinger
parent 460377bec0
commit 6ff013346a
2 changed files with 8 additions and 1 deletions

View file

@ -20,6 +20,7 @@
#include "gtk2ardour-config.h" #include "gtk2ardour-config.h"
#endif #endif
#include "pbd/unwind.h"
#include "pbd/types_convert.h" #include "pbd/types_convert.h"
#include "ardour/rt_safe_delete.h" #include "ardour/rt_safe_delete.h"
@ -49,6 +50,7 @@ RTAManager::RTAManager ()
: _active (false) : _active (false)
, _speed (ARDOUR::DSP::PerceptualAnalyzer::Moderate) , _speed (ARDOUR::DSP::PerceptualAnalyzer::Moderate)
, _warp (ARDOUR::DSP::PerceptualAnalyzer::Medium) , _warp (ARDOUR::DSP::PerceptualAnalyzer::Medium)
, _clearing (false)
{ {
} }
@ -187,6 +189,9 @@ RTAManager::attach (std::shared_ptr<ARDOUR::Route> route)
void void
RTAManager::remove (std::shared_ptr<ARDOUR::Route> route) RTAManager::remove (std::shared_ptr<ARDOUR::Route> route)
{ {
if (_clearing) {
return;
}
_rta.remove_if ([route] (RTAManager::RTA const& r) { return r.route () == route; }); _rta.remove_if ([route] (RTAManager::RTA const& r) { return r.route () == route; });
route->gui_changed ("rta", this); /* EMIT SIGNAL */ route->gui_changed ("rta", this); /* EMIT SIGNAL */
@ -198,6 +203,8 @@ RTAManager::remove (std::shared_ptr<ARDOUR::Route> route)
void void
RTAManager::clear () RTAManager::clear ()
{ {
PBD::Unwinder<bool> uw (_clearing, true);
std::list<RTA>::iterator i = _rta.begin (); std::list<RTA>::iterator i = _rta.begin ();
while (i != _rta.end ()) { while (i != _rta.end ()) {
std::shared_ptr<ARDOUR::Route> route = i->route (); std::shared_ptr<ARDOUR::Route> route = i->route ();

View file

@ -120,6 +120,6 @@ private:
bool _active; bool _active;
ARDOUR::DSP::PerceptualAnalyzer::Speed _speed; ARDOUR::DSP::PerceptualAnalyzer::Speed _speed;
ARDOUR::DSP::PerceptualAnalyzer::Warp _warp; ARDOUR::DSP::PerceptualAnalyzer::Warp _warp;
bool _clearing;
sigc::connection _update_connection; sigc::connection _update_connection;
}; };