summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-07-25 17:16:32 +0200
committerRobin Gareus <robin@gareus.org>2016-07-25 17:16:32 +0200
commiteec294a97edce69ca71c972867ab708d5dd5625d (patch)
treed48202a8e6b5978ba1d6d5a83a574b3a91687460 /libs/ardour
parentac8f4baa002db37506a84088861b7a288dcdfae6 (diff)
the endless quest to plug memory leaks -- episode 378
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/control_protocol_manager.h25
-rw-r--r--libs/ardour/control_protocol_manager.cc17
-rw-r--r--libs/ardour/tempo.cc9
3 files changed, 39 insertions, 12 deletions
diff --git a/libs/ardour/ardour/control_protocol_manager.h b/libs/ardour/ardour/control_protocol_manager.h
index dbbb0c3891..c6ea045ce1 100644
--- a/libs/ardour/ardour/control_protocol_manager.h
+++ b/libs/ardour/ardour/control_protocol_manager.h
@@ -36,20 +36,21 @@ class ControlProtocolDescriptor;
class Session;
class LIBARDOUR_API ControlProtocolInfo {
-public:
- ControlProtocolDescriptor* descriptor;
- ControlProtocol* protocol;
- std::string name;
- std::string path;
- bool requested;
- bool mandatory;
- bool supports_feedback;
- XMLNode* state;
-
- ControlProtocolInfo() : descriptor (0), protocol (0), requested(false),
+ public:
+ ControlProtocolDescriptor* descriptor;
+ ControlProtocol* protocol;
+ std::string name;
+ std::string path;
+ bool requested;
+ bool mandatory;
+ bool supports_feedback;
+ XMLNode* state;
+
+ ControlProtocolInfo() : descriptor (0), protocol (0), requested(false),
mandatory(false), supports_feedback(false), state (0)
{}
- ~ControlProtocolInfo() { delete state; }
+ ~ControlProtocolInfo();
+
};
class LIBARDOUR_API ControlProtocolManager : public PBD::Stateful, public ARDOUR::SessionHandlePtr
diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc
index 2b0a4dce4c..a0a36c17dd 100644
--- a/libs/ardour/control_protocol_manager.cc
+++ b/libs/ardour/control_protocol_manager.cc
@@ -43,6 +43,22 @@ using namespace PBD;
ControlProtocolManager* ControlProtocolManager::_instance = 0;
const string ControlProtocolManager::state_node_name = X_("ControlProtocols");
+
+ControlProtocolInfo::~ControlProtocolInfo ()
+{
+ if (protocol && descriptor) {
+ descriptor->destroy (descriptor, protocol);
+ protocol = 0;
+ }
+
+ delete state; state = 0;
+
+ if (descriptor) {
+ delete (Glib::Module*) descriptor->module;
+ descriptor = 0;
+ }
+}
+
ControlProtocolManager::ControlProtocolManager ()
{
}
@@ -434,6 +450,7 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
ControlProtocolInfo* cpi = cpi_by_name (prop->value());
if (cpi) {
+ delete cpi->state;
cpi->state = new XMLNode (**citer);
if (active) {
diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc
index 793d96c663..56f88d33d9 100644
--- a/libs/ardour/tempo.cc
+++ b/libs/ardour/tempo.cc
@@ -3471,6 +3471,7 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
catch (failed_constructor& err){
error << _("Tempo map: could not set new state, restoring old one.") << endmsg;
_metrics = old_metrics;
+ old_metrics.clear();
break;
}
@@ -3484,6 +3485,7 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
catch (failed_constructor& err) {
error << _("Tempo map: could not set new state, restoring old one.") << endmsg;
_metrics = old_metrics;
+ old_metrics.clear();
break;
}
}
@@ -3535,6 +3537,13 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
}
recompute_map (_metrics);
+
+ Metrics::const_iterator d = old_metrics.begin();
+ while (d != old_metrics.end()) {
+ delete (*d);
+ ++d;
+ }
+ old_metrics.clear ();
}
PropertyChanged (PropertyChange ());