From 8fb8e1bbde25f996533e345ba515a7411525916a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 3 Nov 2016 20:23:40 +0000 Subject: [PATCH] make ControlProtocolManager actually handle control protocols that fail to activate --- libs/ardour/ardour/control_protocol_manager.h | 2 +- libs/ardour/control_protocol_manager.cc | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/libs/ardour/ardour/control_protocol_manager.h b/libs/ardour/ardour/control_protocol_manager.h index c6ea045ce1..2dddc30aca 100644 --- a/libs/ardour/ardour/control_protocol_manager.h +++ b/libs/ardour/ardour/control_protocol_manager.h @@ -93,7 +93,7 @@ class LIBARDOUR_API ControlProtocolManager : public PBD::Stateful, public ARDOUR ControlProtocolDescriptor* get_descriptor (std::string path); ControlProtocolInfo* cpi_by_name (std::string); ControlProtocol* instantiate (ControlProtocolInfo&); - int teardown (ControlProtocolInfo&); + int teardown (ControlProtocolInfo&, bool lock_required); }; } // namespace diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc index 0a21ade1d8..ca8f21e879 100644 --- a/libs/ardour/control_protocol_manager.cc +++ b/libs/ardour/control_protocol_manager.cc @@ -127,7 +127,10 @@ ControlProtocolManager::activate (ControlProtocolInfo& cpi) cp->set_state (XMLNode(""), Stateful::loading_state_version); } - cp->set_active (true); + if (cp->set_active (true)) { + error << string_compose (_("Control protocol support for %1 failed to activate"), cpi.name) << endmsg; + teardown (cpi, false); + } return 0; } @@ -136,7 +139,7 @@ int ControlProtocolManager::deactivate (ControlProtocolInfo& cpi) { cpi.requested = false; - return teardown (cpi); + return teardown (cpi, true); } void @@ -206,7 +209,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi) } int -ControlProtocolManager::teardown (ControlProtocolInfo& cpi) +ControlProtocolManager::teardown (ControlProtocolInfo& cpi, bool lock_required) { if (!cpi.protocol) { @@ -240,7 +243,7 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi) cpi.descriptor->destroy (cpi.descriptor, cpi.protocol); - { + if (lock_required) { Glib::Threads::Mutex::Lock lm (protocols_lock); list::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol); if (p != control_protocols.end()) { @@ -248,6 +251,13 @@ ControlProtocolManager::teardown (ControlProtocolInfo& cpi) } else { cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocols" << endl; } + } else { + list::iterator p = find (control_protocols.begin(), control_protocols.end(), cpi.protocol); + if (p != control_protocols.end()) { + control_protocols.erase (p); + } else { + cerr << "Programming error: ControlProtocolManager::teardown() called for " << cpi.name << ", but it was not found in control_protocols" << endl; + } } cpi.protocol = 0; @@ -462,7 +472,7 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/) } } else { if (_session) { - teardown (*cpi); + teardown (*cpi, true); } else { cpi->requested = false; }