summaryrefslogtreecommitdiff
path: root/libs/ardour/slavable.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-05-20 17:24:30 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-05-31 15:30:44 -0400
commitfe1d27444b5b79ec5623fd8b4ad8948aad973f8b (patch)
tree28fdf067f8d64cbbe0014e17835f9369aba080f7 /libs/ardour/slavable.cc
parentdc3ebc8eecb2b7d3835de699bc993e9f7d25c514 (diff)
don't store shared_ptr<VCA> in functor for Drop or DropReferences signal from VCA in Slavable
Diffstat (limited to 'libs/ardour/slavable.cc')
-rw-r--r--libs/ardour/slavable.cc19
1 files changed, 18 insertions, 1 deletions
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