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))

Reply via email to