diff options
Diffstat (limited to 'dev-libs/boost/files/boost-1.84.0-signals2-patch1.patch')
-rw-r--r-- | dev-libs/boost/files/boost-1.84.0-signals2-patch1.patch | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/dev-libs/boost/files/boost-1.84.0-signals2-patch1.patch b/dev-libs/boost/files/boost-1.84.0-signals2-patch1.patch new file mode 100644 index 000000000000..9c07bd8f06cf --- /dev/null +++ b/dev-libs/boost/files/boost-1.84.0-signals2-patch1.patch @@ -0,0 +1,124 @@ +https://github.com/boostorg/signals2/issues/70 + +From 2ba258f7b465e7bde14663ca3a966019b4ec3694 Mon Sep 17 00:00:00 2001 +From: Frank Mori Hess <fmh6jj@gmail.com> +Date: Sat, 30 Dec 2023 14:34:58 -0500 +Subject: [PATCH] Fix disconnect by slot when the slot is another signal. + +--- a/boost/signals2/detail/signal_template.hpp ++++ b/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; |