mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-05-15 00:14:08 +02:00
Merge bitcoin/bitcoin#34495: Replace boost signals with minimal compatible implementation
242b0ebb5cbtcsignals: use a single shared_ptr for liveness and callback (Cory Fields)b12f43a0a8signals: remove boost::signals2 from depends and vcpkg (Cory Fields)a4b1607983signals: remove boost::signals2 mentions in linters and docs (Cory Fields)375397ebd9signals: remove boost includes where possible (Cory Fields)091736a153signals: re-add forward-declares to interface headers (Cory Fields)9958f4fe49Revert "signals: Temporarily add boost headers to bitcoind and bitcoin-node builds" (Cory Fields)34eabd77a2signals: remove boost compatibility guards (Cory Fields)e60a0b9a22signals: Add a simplified boost-compatible implementation (Cory Fields)63c68e2a3fsignals: add signals tests (Cory Fields)edc2978058signals: use an alias for the boost::signals2 namespace (Cory Fields)9ade3929aasignals: remove forward-declare for signals (Cory Fields)037e58b57bsignals: use forwarding header for boost signals (Cory Fields)2150153f37signals: Temporarily add boost headers to bitcoind and bitcoin-node builds (Cory Fields)fd5e9d9904signals: Use a lambda to avoid connecting a signal to another signal (Cory Fields) Pull request description: This drops our dependency on `boost::signals2`, leaving `boost::multi_index` as the only remaining boost dependency for bitcoind. `boost::signals2` is a complex beast, but we only use a small portion of it. Namely: it's a way for multiple subscribers to connect to the same event, and the ability to later disconnect individual subscribers from that event. `btcsignals` adheres to the subset of the `boost::signals2` API that we currently use, and thus is a drop-in replacement. Rather than implementing a complex `slot` tracking class that we never used anyway (and which was much more useful in the days before std::function existed), callbacks are simply wrapped directly in `std::function`s. The new tests work with either `boost::signals2` or the new `btcsignals` implementation. Reviewers can verify functional equivalency by running the tests in the commit that introduces them against `boost::signals2`, then again with `btcsignals`. The majority of the commits in this PR are preparation and cleanup. Once `boost::signals2` is no longer needed, it is removed from depends. Additionally, a few CMake targets no longer need boost includes as they were previously only required for signals. I think this is actually pretty straightforward to review. I kept things simple, including keeping types unmovable/uncopyable where possible rather than trying to define those semantics. In doing so, the new implementation has even fewer type requirements than boost, which I believe is due to a boost bug. I've opened a PR upstream for that to attempt to maintain parity between the implementations. See individual commits for more details. Closes #26442. ACKs for top commit: fjahr: Code review ACK242b0ebb5cmaflcko: re-review ACK242b0ebb5c🎯 w0xlt: reACK242b0ebb5cTree-SHA512: 9a472afa4f655624fa44493774a63b57509ad30fb61bf1d89b6d0b52000cb9a1409a5b8d515a99c76e0b26b2437c30508206c29a7dd44ea96eb1979d572cd4d4
This commit is contained in:
@@ -4,33 +4,31 @@
|
||||
|
||||
#include <node/interface_ui.h>
|
||||
|
||||
#include <btcsignals.h>
|
||||
#include <util/string.h>
|
||||
#include <util/translation.h>
|
||||
|
||||
#include <boost/signals2/optional_last_value.hpp>
|
||||
#include <boost/signals2/signal.hpp>
|
||||
|
||||
using util::MakeUnorderedList;
|
||||
|
||||
CClientUIInterface uiInterface;
|
||||
|
||||
struct UISignals {
|
||||
boost::signals2::signal<CClientUIInterface::ThreadSafeMessageBoxSig, boost::signals2::optional_last_value<bool>> ThreadSafeMessageBox;
|
||||
boost::signals2::signal<CClientUIInterface::ThreadSafeQuestionSig, boost::signals2::optional_last_value<bool>> ThreadSafeQuestion;
|
||||
boost::signals2::signal<CClientUIInterface::InitMessageSig> InitMessage;
|
||||
boost::signals2::signal<CClientUIInterface::InitWalletSig> InitWallet;
|
||||
boost::signals2::signal<CClientUIInterface::NotifyNumConnectionsChangedSig> NotifyNumConnectionsChanged;
|
||||
boost::signals2::signal<CClientUIInterface::NotifyNetworkActiveChangedSig> NotifyNetworkActiveChanged;
|
||||
boost::signals2::signal<CClientUIInterface::NotifyAlertChangedSig> NotifyAlertChanged;
|
||||
boost::signals2::signal<CClientUIInterface::ShowProgressSig> ShowProgress;
|
||||
boost::signals2::signal<CClientUIInterface::NotifyBlockTipSig> NotifyBlockTip;
|
||||
boost::signals2::signal<CClientUIInterface::NotifyHeaderTipSig> NotifyHeaderTip;
|
||||
boost::signals2::signal<CClientUIInterface::BannedListChangedSig> BannedListChanged;
|
||||
btcsignals::signal<CClientUIInterface::ThreadSafeMessageBoxSig, btcsignals::optional_last_value<bool>> ThreadSafeMessageBox;
|
||||
btcsignals::signal<CClientUIInterface::ThreadSafeQuestionSig, btcsignals::optional_last_value<bool>> ThreadSafeQuestion;
|
||||
btcsignals::signal<CClientUIInterface::InitMessageSig> InitMessage;
|
||||
btcsignals::signal<CClientUIInterface::InitWalletSig> InitWallet;
|
||||
btcsignals::signal<CClientUIInterface::NotifyNumConnectionsChangedSig> NotifyNumConnectionsChanged;
|
||||
btcsignals::signal<CClientUIInterface::NotifyNetworkActiveChangedSig> NotifyNetworkActiveChanged;
|
||||
btcsignals::signal<CClientUIInterface::NotifyAlertChangedSig> NotifyAlertChanged;
|
||||
btcsignals::signal<CClientUIInterface::ShowProgressSig> ShowProgress;
|
||||
btcsignals::signal<CClientUIInterface::NotifyBlockTipSig> NotifyBlockTip;
|
||||
btcsignals::signal<CClientUIInterface::NotifyHeaderTipSig> NotifyHeaderTip;
|
||||
btcsignals::signal<CClientUIInterface::BannedListChangedSig> BannedListChanged;
|
||||
};
|
||||
static UISignals g_ui_signals;
|
||||
|
||||
#define ADD_SIGNALS_IMPL_WRAPPER(signal_name) \
|
||||
boost::signals2::connection CClientUIInterface::signal_name##_connect(std::function<signal_name##Sig> fn) \
|
||||
btcsignals::connection CClientUIInterface::signal_name##_connect(std::function<signal_name##Sig> fn) \
|
||||
{ \
|
||||
return g_ui_signals.signal_name.connect(fn); \
|
||||
}
|
||||
|
||||
@@ -15,11 +15,9 @@ class CBlockIndex;
|
||||
enum class SynchronizationState;
|
||||
struct bilingual_str;
|
||||
|
||||
namespace boost {
|
||||
namespace signals2 {
|
||||
class connection;
|
||||
}
|
||||
} // namespace boost
|
||||
namespace btcsignals {
|
||||
class connection;
|
||||
} // namespace btcsignals
|
||||
|
||||
/** Signals for UI communication. */
|
||||
class CClientUIInterface
|
||||
@@ -71,7 +69,7 @@ public:
|
||||
#define ADD_SIGNALS_DECL_WRAPPER(signal_name, rtype, ...) \
|
||||
rtype signal_name(__VA_ARGS__); \
|
||||
using signal_name##Sig = rtype(__VA_ARGS__); \
|
||||
boost::signals2::connection signal_name##_connect(std::function<signal_name##Sig> fn)
|
||||
btcsignals::connection signal_name##_connect(std::function<signal_name##Sig> fn)
|
||||
|
||||
/** Show message box. */
|
||||
ADD_SIGNALS_DECL_WRAPPER(ThreadSafeMessageBox, bool, const bilingual_str& message, unsigned int style);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <addrdb.h>
|
||||
#include <banman.h>
|
||||
#include <blockfilter.h>
|
||||
#include <btcsignals.h>
|
||||
#include <chain.h>
|
||||
#include <chainparams.h>
|
||||
#include <common/args.h>
|
||||
@@ -72,8 +73,6 @@
|
||||
#include <stdexcept>
|
||||
#include <utility>
|
||||
|
||||
#include <boost/signals2/signal.hpp>
|
||||
|
||||
using interfaces::BlockRef;
|
||||
using interfaces::BlockTemplate;
|
||||
using interfaces::BlockTip;
|
||||
|
||||
Reference in New Issue
Block a user