make ControlProtocolManager actually handle control protocols that fail to activate

This commit is contained in:
Paul Davis 2016-11-03 20:23:40 +00:00
parent 3abdef2637
commit 8fb8e1bbde
2 changed files with 16 additions and 6 deletions

View File

@ -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

View File

@ -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<ControlProtocol*>::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<ControlProtocol*>::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;
}