hand over automationlist undo state ownership (mem-leak)
authorRobin Gareus <robin@gareus.org>
Sun, 24 Apr 2016 11:07:07 +0000 (13:07 +0200)
committerRobin Gareus <robin@gareus.org>
Sun, 24 Apr 2016 12:43:18 +0000 (14:43 +0200)
libs/ardour/ardour/automation_list.h
libs/ardour/automation_list.cc

index c437462be42dca666813640c877ff4721fed471f..a57460c31bb5cde87831e34c2cff0c467617ed36 100644 (file)
@@ -119,7 +119,7 @@ class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Ev
 
        bool operator!= (const AutomationList &) const;
 
-       XMLNode* before () { return _before; }
+       XMLNode* before () { XMLNode* rv = _before; _before = 0; return rv; }
        void clear_history ();
   private:
        void create_curve_if_necessary ();
index 636a1bbede60a42b3b8004b3a08a9a989541c734..761aa31867807b0e6363f6b7f097ced8e6d4216b 100644 (file)
@@ -131,6 +131,7 @@ AutomationList::AutomationList (const XMLNode& node, Evoral::Parameter id)
 
 AutomationList::~AutomationList()
 {
+       delete _before;
 }
 
 boost::shared_ptr<Evoral::ControlList>
@@ -192,8 +193,11 @@ AutomationList::set_automation_state (AutoState s)
 {
        if (s != _state) {
                _state = s;
+               delete _before;
                if (s == Write && _desc.toggled) {
                        _before = &get_state ();
+               } else {
+                       _before = 0;
                }
                automation_state_changed (s); /* EMIT SIGNAL */
        }
@@ -211,8 +215,11 @@ AutomationList::set_automation_style (AutoStyle s)
 void
 AutomationList::start_write_pass (double when)
 {
+       delete _before;
        if (in_new_write_pass ()) {
                _before = &get_state ();
+       } else {
+               _before = 0;
        }
        ControlList::start_write_pass (when);
 }
@@ -221,8 +228,6 @@ void
 AutomationList::write_pass_finished (double when, double thinning_factor)
 {
        ControlList::write_pass_finished (when, thinning_factor);
-       /* automation control has deleted this or it is now owned by the session undo stack */
-       _before = 0;
 }
 
 void
@@ -260,7 +265,9 @@ AutomationList::stop_touch (bool mark, double)
 
 /* _before may be owned by the undo stack,
  * so we have to be careful about doing this.
-*/
+ *
+ * ::before () transfers ownership, setting _before to 0
+ */
 void
 AutomationList::clear_history ()
 {