From 5361a3f5c46afded2b2b89bc0b0c468721007ac2 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 4 Sep 2020 22:47:20 +0200 Subject: [PATCH] Fix deadlock at session-close, due to shared-ptr in signal connection https://pastebin.com/08UcTRsP https://ardour.org/styleguide.html # 10 --- gtk2_ardour/bundle_manager.cc | 7 ++++--- gtk2_ardour/bundle_manager.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/bundle_manager.cc b/gtk2_ardour/bundle_manager.cc index 0719434c86..cde526d7c5 100644 --- a/gtk2_ardour/bundle_manager.cc +++ b/gtk2_ardour/bundle_manager.cc @@ -375,13 +375,14 @@ BundleManager::add_bundle (boost::shared_ptr b) (*i)[_list_model_columns.name] = u->name (); (*i)[_list_model_columns.bundle] = u; - u->Changed.connect (bundle_connections, invalidator (*this), boost::bind (&BundleManager::bundle_changed, this, _1, u), gui_context()); + u->Changed.connect (bundle_connections, invalidator (*this), boost::bind (&BundleManager::bundle_changed, this, _1, boost::weak_ptr (u)), gui_context()); } void -BundleManager::bundle_changed (Bundle::Change c, boost::shared_ptr b) +BundleManager::bundle_changed (Bundle::Change c, boost::weak_ptr wb) { - if ((c & Bundle::NameChanged) == 0) { + boost::shared_ptr b = wb.lock (); + if (!b || 0 == (c & Bundle::NameChanged)) { return; } diff --git a/gtk2_ardour/bundle_manager.h b/gtk2_ardour/bundle_manager.h index 7ba3c7df9f..fc365a0992 100644 --- a/gtk2_ardour/bundle_manager.h +++ b/gtk2_ardour/bundle_manager.h @@ -95,7 +95,7 @@ private: void edit_clicked (); void delete_clicked (); void add_bundle (boost::shared_ptr); - void bundle_changed (ARDOUR::Bundle::Change, boost::shared_ptr); + void bundle_changed (ARDOUR::Bundle::Change, boost::weak_ptr); void set_button_sensitivity (); void row_activated (Gtk::TreeModel::Path const & p, Gtk::TreeViewColumn* c);