summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/slavable.h1
-rw-r--r--libs/ardour/slavable.cc19
2 files changed, 19 insertions, 1 deletions
diff --git a/libs/ardour/ardour/slavable.h b/libs/ardour/ardour/slavable.h
index e5c8688df1..83675f0e22 100644
--- a/libs/ardour/ardour/slavable.h
+++ b/libs/ardour/ardour/slavable.h
@@ -70,6 +70,7 @@ class LIBARDOUR_API Slavable
PBD::ScopedConnectionList unassign_connections;
int do_assign (VCAManager* s);
+ void weak_unassign (boost::weak_ptr<VCA>);
};
diff --git a/libs/ardour/slavable.cc b/libs/ardour/slavable.cc
index b6921c55c1..3467e94033 100644
--- a/libs/ardour/slavable.cc
+++ b/libs/ardour/slavable.cc
@@ -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