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;
}
ControlProtocolManager::deactivate (ControlProtocolInfo& cpi)
{
cpi.requested = false;
- return teardown (cpi);
+ return teardown (cpi, true);
}
void
}
int
-ControlProtocolManager::teardown (ControlProtocolInfo& cpi)
+ControlProtocolManager::teardown (ControlProtocolInfo& cpi, bool lock_required)
{
if (!cpi.protocol) {
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()) {
} 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;
if ((descriptor = get_descriptor (path)) != 0) {
if (!descriptor->probe (descriptor)) {
- DEBUG_TRACE (DEBUG::ControlProtocols,
- string_compose (_("Control protocol %1 not usable"), descriptor->name));
+ warning << string_compose (_("Control protocol %1 not usable"), descriptor->name) << endmsg;
} else {
ControlProtocolInfo* cpi = new ControlProtocolInfo ();
}
} else {
if (_session) {
- teardown (*cpi);
+ teardown (*cpi, true);
} else {
cpi->requested = false;
}