don't store shared_ptr<VCA> in functor for Drop or DropReferences signal from VCA...
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 20 May 2016 21:24:30 +0000 (17:24 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 31 May 2016 19:30:44 +0000 (15:30 -0400)
libs/ardour/ardour/slavable.h
libs/ardour/slavable.cc

index e5c8688df1086360861e00de77610797bbf6e18f..83675f0e22f794370a95989751a317d22b886003 100644 (file)
@@ -70,6 +70,7 @@ class LIBARDOUR_API Slavable
        PBD::ScopedConnectionList unassign_connections;
 
        int do_assign (VCAManager* s);
+       void weak_unassign (boost::weak_ptr<VCA>);
 
 };
 
index b6921c55c11be2dc83cf6c773b4e5f50508cbc55..3467e94033f4a5220e2ba2835ef163ce5408f944 100644 (file)
@@ -83,6 +83,7 @@ Slavable::set_state (XMLNode const& node, int version)
        return 0;
 }
 
+
 int
 Slavable::do_assign (VCAManager* manager)
 {
@@ -121,7 +122,23 @@ Slavable::assign (boost::shared_ptr<VCA> v)
                _masters.insert (v->number());
        }
 
-       v->Drop.connect_same_thread (unassign_connections, boost::bind (&Slavable::unassign, this, v));
+       /* Do NOT use ::unassign() because it will store a
+        * boost::shared_ptr<VCA> in the functor, leaving a dangling ref to the
+        * VCA.
+        */
+
+
+       v->Drop.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v)));
+       v->DropReferences.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v)));
+}
+
+void
+Slavable::weak_unassign (boost::weak_ptr<VCA> v)
+{
+       boost::shared_ptr<VCA> sv (v.lock());
+       if (sv) {
+               unassign (sv);
+       }
 }
 
 void