Source: boost1.83 Followup-For: Bug #1056100 Control: tags -1 ftbfs patch I've extraced the upsteam patches, they seem to work for swift-im.
Attached for your convenience. -- tobi -- System Information: Debian Release: trixie/sid APT prefers oldstable-updates APT policy: (500, 'oldstable-updates'), (500, 'oldstable-security'), (500, 'unstable'), (500, 'testing'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 6.9.11-amd64 (SMP w/8 CPU threads; PREEMPT) Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8), LANGUAGE=en_US:en Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled
>From 2ba258f7b465e7bde14663ca3a966019b4ec3694 Mon Sep 17 00:00:00 2001 From: Frank Mori Hess <fmh...@gmail.com> Date: Sat, 30 Dec 2023 14:34:58 -0500 Subject: [PATCH] Fix disconnect by slot when the slot is another signal. --- .../boost/signals2/detail/signal_template.hpp | 48 +++++++++++++++---- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/libs/signals2/include/boost/signals2/detail/signal_template.hpp b/include/boost/signals2/detail/signal_template.hpp index a399883c..4546906d 100644 --- a/libs/signals2/include/boost/signals2/detail/signal_template.hpp +++ b/libs/signals2/include/boost/signals2/detail/signal_template.hpp @@ -103,9 +103,9 @@ namespace boost BOOST_SIGNALS2_FORWARDED_ARGS(BOOST_SIGNALS2_NUM_ARGS)); } template<typename T> - bool operator==(const T &other) const + bool contains(const T &other) const { - return _fun == other; + return _fun.contains(other); } private: BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_N(BOOST_SIGNALS2_NUM_ARGS)() @@ -115,6 +115,8 @@ namespace boost boost::shared_ptr<connection> _connection; }; + template<BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(BOOST_SIGNALS2_NUM_ARGS)> + class BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS); template<BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(BOOST_SIGNALS2_NUM_ARGS)> class BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS); @@ -150,6 +152,8 @@ namespace boost typedef GroupCompare group_compare_type; typedef typename detail::slot_call_iterator_t<slot_invoker, typename connection_list_type::iterator, connection_body<group_key_type, slot_type, Mutex> > slot_call_iterator; + typedef detail::BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) + <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> weak_signal_type; BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)(const combiner_type &combiner_arg, const group_compare_type &group_compare): @@ -531,13 +535,20 @@ namespace boost { (*it)->nolock_disconnect(lock); }else - { - // check for wrapped extended slot + { // check for wrapped extended slot bound_extended_slot_function_type *fp; fp = (*it)->slot().slot_function().template target<bound_extended_slot_function_type>(); - if(fp && function_equal(*fp, slot)) + if(fp && fp->contains(slot)) { (*it)->nolock_disconnect(lock); + }else + { // check for wrapped signal + weak_signal_type *fp; + fp = (*it)->slot().slot_function().template target<weak_signal_type>(); + if(fp && fp->contains(slot)) + { + (*it)->nolock_disconnect(lock); + } } } } @@ -588,8 +599,6 @@ namespace boost const boost::shared_ptr<mutex_type> _mutex; }; - template<BOOST_SIGNALS2_SIGNAL_TEMPLATE_DECL(BOOST_SIGNALS2_NUM_ARGS)> - class BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS); } template<BOOST_SIGNALS2_SIGNAL_TEMPLATE_DEFAULTED_DECL(BOOST_SIGNALS2_NUM_ARGS)> @@ -603,8 +612,7 @@ namespace boost typedef detail::BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> impl_class; public: - typedef detail::BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) - <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> weak_signal_type; + typedef typename impl_class::weak_signal_type weak_signal_type; friend class detail::BOOST_SIGNALS2_WEAK_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION>; @@ -746,12 +754,24 @@ namespace boost using std::swap; swap(_pimpl, other._pimpl); } + bool operator==(const BOOST_SIGNALS2_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) & other) const + { + return _pimpl.get() == other._pimpl.get(); + } protected: virtual shared_ptr<void> lock_pimpl() const { return _pimpl; } private: + // explicit private copy constructor to avoid compiler trying to do implicit conversions to signal + explicit BOOST_SIGNALS2_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS)( + const BOOST_SIGNALS2_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) & other) BOOST_NOEXCEPT + { + // noncopyable + BOOST_ASSERT(false); + } + shared_ptr<impl_class> _pimpl; }; @@ -802,6 +822,16 @@ namespace boost shared_pimpl(_weak_pimpl.lock()); return (*shared_pimpl)(BOOST_SIGNALS2_SIGNATURE_ARG_NAMES(BOOST_SIGNALS2_NUM_ARGS)); } + bool contains(const BOOST_SIGNALS2_SIGNAL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) + <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> &signal) const + { + return _weak_pimpl.lock().get() == signal._pimpl.get(); + } + template <typename T> + bool contains(const T&) const + { + return false; + } private: boost::weak_ptr<detail::BOOST_SIGNALS2_SIGNAL_IMPL_CLASS_NAME(BOOST_SIGNALS2_NUM_ARGS) <BOOST_SIGNALS2_SIGNAL_TEMPLATE_INSTANTIATION> > _weak_pimpl;
>From 4d994bbed820882059c7842ba5e230a26d68f2f0 Mon Sep 17 00:00:00 2001 From: Frank Mori Hess <fmh...@gmail.com> Date: Sat, 30 Dec 2023 14:51:49 -0500 Subject: [PATCH] Fix disconnect by slot when slot is wrapped in a boost::reference_wrapper --- include/boost/signals2/detail/signal_template.hpp | 2 +- test/signal_test.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/boost/signals2/detail/signal_template.hpp b/include/boost/signals2/detail/signal_template.hpp index 4546906d..0bed2dd1 100644 --- a/libs/signals2/include/boost/signals2/detail/signal_template.hpp +++ b/libs/signals2/include/boost/signals2/detail/signal_template.hpp @@ -223,7 +223,7 @@ namespace boost void disconnect(const T &slot) { typedef mpl::bool_<(is_convertible<T, group_type>::value)> is_group; - do_disconnect(slot, is_group()); + do_disconnect(unwrap_ref(slot), is_group()); } // emit signal result_type operator ()(BOOST_SIGNALS2_SIGNATURE_FULL_ARGS(BOOST_SIGNALS2_NUM_ARGS))