From fe1d27444b5b79ec5623fd8b4ad8948aad973f8b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 20 May 2016 17:24:30 -0400 Subject: don't store shared_ptr in functor for Drop or DropReferences signal from VCA in Slavable --- libs/ardour/ardour/slavable.h | 1 + libs/ardour/slavable.cc | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'libs') 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); }; 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 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 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(v))); + v->DropReferences.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr(v))); +} + +void +Slavable::weak_unassign (boost::weak_ptr v) +{ + boost::shared_ptr sv (v.lock()); + if (sv) { + unassign (sv); + } } void -- cgit v1.2.3