Remove chicken/egg d'tor
authorRobin Gareus <robin@gareus.org>
Sat, 23 Mar 2019 13:28:12 +0000 (14:28 +0100)
committerRobin Gareus <robin@gareus.org>
Sat, 23 Mar 2019 13:31:00 +0000 (14:31 +0100)
Session::Controllables is a shared_ptr<> list. As long
as the session exists the Controllables will be around. Destroyed(*)
can only be called after the session is destroyed and releases the
shared_ptr<>

NB. this code had a nice hack to construct a "shared_from_this"
workaround. For future reference:

struct null_deleter { void operator()(void const *) const {} };
boost::shared_ptr<Controllable>(c, null_deleter())

libs/ardour/ardour/session.h
libs/ardour/session_state.cc

index ab7b59c5c6559a3cfe3a2f8465fc3d412099f4e1..265e197d001c237f7ad9f5f05fe10645608e7bdf 100644 (file)
@@ -1079,7 +1079,6 @@ public:
        boost::shared_ptr<AutomationControl> automation_control_by_id (const PBD::ID&);
 
        void add_controllable (boost::shared_ptr<PBD::Controllable>);
-       void remove_controllable (PBD::Controllable*);
 
        boost::shared_ptr<PBD::Controllable> solo_cut_control() const;
 
index 6e791b4d8a3b16e1ee6389e9ef5e9c8ecb370fc0..9ed5a272693dfe723247ff73952c28323d08153c 100644 (file)
@@ -208,7 +208,6 @@ Session::pre_engine_init (string fullpath)
        SourceFactory::SourceCreated.connect_same_thread (*this, boost::bind (&Session::add_source, this, _1));
        PlaylistFactory::PlaylistCreated.connect_same_thread (*this, boost::bind (&Session::add_playlist, this, _1, _2));
        AutomationList::AutomationListCreated.connect_same_thread (*this, boost::bind (&Session::add_automation_list, this, _1));
-       Controllable::Destroyed.connect_same_thread (*this, boost::bind (&Session::remove_controllable, this, _1));
        IO::PortCountChanged.connect_same_thread (*this, boost::bind (&Session::ensure_buffers, this, _1));
 
        /* stop IO objects from doing stuff until we're ready for them */
@@ -3739,24 +3738,6 @@ Session::add_controllable (boost::shared_ptr<Controllable> c)
        controllables.insert (c);
 }
 
-struct null_deleter { void operator()(void const *) const {} };
-
-void
-Session::remove_controllable (Controllable* c)
-{
-       if (deletion_in_progress()) {
-               return;
-       }
-
-       Glib::Threads::Mutex::Lock lm (controllables_lock);
-
-       Controllables::iterator x = controllables.find (boost::shared_ptr<Controllable>(c, null_deleter()));
-
-       if (x != controllables.end()) {
-               controllables.erase (x);
-       }
-}
-
 boost::shared_ptr<Controllable>
 Session::controllable_by_id (const PBD::ID& id)
 {