undo "ui: Compile boost:signals2 only once"
What changed, and why it matters
This commit is a straightforward code cleanup that reverts an earlier optimization. It changes how internal user-interface signals are wired up, switching from hand-written wrapper functions back to direct use of a newer, slimmer signal library. There is no security-relevant change: the same signals are used, the same handlers are connected, and no new capabilities or data flows are introduced.
No security action required. Treat as a normal refactoring/revert review.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch undoes commit fa5ce273, which had introduced per-signal _connect wrapper functions and a private UISignals struct so that boost::signals2 headers were compiled in only one translation unit. After Bitcoin Core replaced boost::signals2 with a lightweight btcsignals implementation, that compile-time optimization is no longer needed. The change exposes btcsignals::signal members directly on CClientUIInterface, removes the wrapper functions and the global g_ui_signals object, and updates all call sites from uiInterface.SignalName_connect(...) to uiInterface.SignalName.connect(...). The functional behavior is identical.
Changed components
src/node/interface_ui.hsrc/node/interface_ui.cppsrc/node/interfaces.cppsrc/init.cppsrc/noui.cppsrc/qt/bitcoin.cppInspect captured patch +35 / −87
diff --git a/src/init.cpp b/src/init.cpp
index a2277728..d2e29020 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -1573,7 +1573,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
* be disabled when initialisation is finished.
*/
if (args.GetBoolArg("-server", false)) {
- uiInterface.InitMessage_connect(SetRPCWarmupStatus);
+ uiInterface.InitMessage.connect(SetRPCWarmupStatus);
if (!AppInitServers(node))
return InitError(_("Unable to start HTTP server. See debug log for details."));
}
@@ -2025,7 +2025,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
#if HAVE_SYSTEM
const std::string block_notify = args.GetArg("-blocknotify", "");
if (!block_notify.empty()) {
- uiInterface.NotifyBlockTip_connect([block_notify](SynchronizationState sync_state, const CBlockIndex& block, double /* verification_progress */) {
+ uiInterface.NotifyBlockTip.connect([block_notify](SynchronizationState sync_state, const CBlockIndex& block, double /* verification_progress */) {
if (sync_state != SynchronizationState::POST_INIT) return;
std::string command = block_notify;
ReplaceAll(command, "%s", block.GetBlockHash().GetHex());
diff --git a/src/node/interface_ui.cpp b/src/node/interface_ui.cpp
index a9a3da2b..74922f21 100644
--- a/src/node/interface_ui.cpp
+++ b/src/node/interface_ui.cpp
@@ -12,51 +12,6 @@ using util::MakeUnorderedList;
CClientUIInterface uiInterface;
-struct UISignals {
- btcsignals::signal<CClientUIInterface::ThreadSafeMessageBoxSig> ThreadSafeMessageBox;
- btcsignals::signal<CClientUIInterface::ThreadSafeQuestionSig, btcsignals::any_of> 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) \
- btcsignals::connection CClientUIInterface::signal_name##_connect(std::function<signal_name##Sig> fn) \
- { \
- return g_ui_signals.signal_name.connect(fn); \
- }
-
-ADD_SIGNALS_IMPL_WRAPPER(ThreadSafeMessageBox);
-ADD_SIGNALS_IMPL_WRAPPER(ThreadSafeQuestion);
-ADD_SIGNALS_IMPL_WRAPPER(InitMessage);
-ADD_SIGNALS_IMPL_WRAPPER(InitWallet);
-ADD_SIGNALS_IMPL_WRAPPER(NotifyNumConnectionsChanged);
-ADD_SIGNALS_IMPL_WRAPPER(NotifyNetworkActiveChanged);
-ADD_SIGNALS_IMPL_WRAPPER(NotifyAlertChanged);
-ADD_SIGNALS_IMPL_WRAPPER(ShowProgress);
-ADD_SIGNALS_IMPL_WRAPPER(NotifyBlockTip);
-ADD_SIGNALS_IMPL_WRAPPER(NotifyHeaderTip);
-ADD_SIGNALS_IMPL_WRAPPER(BannedListChanged);
-
-void CClientUIInterface::ThreadSafeMessageBox(const bilingual_str& message, unsigned int style) { return g_ui_signals.ThreadSafeMessageBox(message, style); }
-bool CClientUIInterface::ThreadSafeQuestion(const bilingual_str& message, const std::string& non_interactive_message, unsigned int style) { return g_ui_signals.ThreadSafeQuestion(message, non_interactive_message, style);}
-void CClientUIInterface::InitMessage(const std::string& message) { return g_ui_signals.InitMessage(message); }
-void CClientUIInterface::InitWallet() { return g_ui_signals.InitWallet(); }
-void CClientUIInterface::NotifyNumConnectionsChanged(int newNumConnections) { return g_ui_signals.NotifyNumConnectionsChanged(newNumConnections); }
-void CClientUIInterface::NotifyNetworkActiveChanged(bool networkActive) { return g_ui_signals.NotifyNetworkActiveChanged(networkActive); }
-void CClientUIInterface::NotifyAlertChanged() { return g_ui_signals.NotifyAlertChanged(); }
-void CClientUIInterface::ShowProgress(const std::string& title, int nProgress, bool resume_possible) { return g_ui_signals.ShowProgress(title, nProgress, resume_possible); }
-void CClientUIInterface::NotifyBlockTip(SynchronizationState s, const CBlockIndex& block, double verification_progress) { return g_ui_signals.NotifyBlockTip(s, block, verification_progress); }
-void CClientUIInterface::NotifyHeaderTip(SynchronizationState s, int64_t height, int64_t timestamp, bool presync) { return g_ui_signals.NotifyHeaderTip(s, height, timestamp, presync); }
-void CClientUIInterface::BannedListChanged() { return g_ui_signals.BannedListChanged(); }
-
bool InitError(const bilingual_str& str)
{
uiInterface.ThreadSafeMessageBox(str, CClientUIInterface::MSG_ERROR);
diff --git a/src/node/interface_ui.h b/src/node/interface_ui.h
index 47e3da2c..96159196 100644
--- a/src/node/interface_ui.h
+++ b/src/node/interface_ui.h
@@ -6,6 +6,8 @@
#ifndef BITCOIN_NODE_INTERFACE_UI_H
#define BITCOIN_NODE_INTERFACE_UI_H
+#include <util/btcsignals.h>
+
#include <cstdint>
#include <functional>
#include <string>
@@ -15,10 +17,6 @@ class CBlockIndex;
enum class SynchronizationState;
struct bilingual_str;
-namespace btcsignals {
- class connection;
-} // namespace btcsignals
-
/** Signals for UI communication. */
class CClientUIInterface
{
@@ -66,48 +64,43 @@ public:
MSG_ERROR = (ICON_ERROR | BTN_OK | MODAL)
};
-#define ADD_SIGNALS_DECL_WRAPPER(signal_name, rtype, ...) \
- rtype signal_name(__VA_ARGS__); \
- using signal_name##Sig = rtype(__VA_ARGS__); \
- btcsignals::connection signal_name##_connect(std::function<signal_name##Sig> fn)
-
/** Show message box. */
- ADD_SIGNALS_DECL_WRAPPER(ThreadSafeMessageBox, void, const bilingual_str& message, unsigned int style);
+ btcsignals::signal<void(const bilingual_str& message, unsigned int style)> ThreadSafeMessageBox;
/** If possible, ask the user a question. If not, falls back to ThreadSafeMessageBox(noninteractive_message, style) and returns false. */
- ADD_SIGNALS_DECL_WRAPPER(ThreadSafeQuestion, bool, const bilingual_str& message, const std::string& noninteractive_message, unsigned int style);
+ btcsignals::signal<bool(const bilingual_str& message, const std::string& noninteractive_message, unsigned int style), btcsignals::any_of> ThreadSafeQuestion;
/** Progress message during initialization. */
- ADD_SIGNALS_DECL_WRAPPER(InitMessage, void, const std::string& message);
+ btcsignals::signal<void(const std::string& message)> InitMessage;
/** Wallet loader created. */
- ADD_SIGNALS_DECL_WRAPPER(InitWallet, void, );
+ btcsignals::signal<void()> InitWallet;
/** Number of network connections changed. */
- ADD_SIGNALS_DECL_WRAPPER(NotifyNumConnectionsChanged, void, int newNumConnections);
+ btcsignals::signal<void(int newNumConnections)> NotifyNumConnectionsChanged;
/** Network activity state changed. */
- ADD_SIGNALS_DECL_WRAPPER(NotifyNetworkActiveChanged, void, bool networkActive);
+ btcsignals::signal<void(bool networkActive)> NotifyNetworkActiveChanged;
/**
* Status bar alerts changed.
*/
- ADD_SIGNALS_DECL_WRAPPER(NotifyAlertChanged, void, );
+ btcsignals::signal<void()> NotifyAlertChanged;
/**
* Show progress e.g. for verifychain.
* resume_possible indicates shutting down now will result in the current progress action resuming upon restart.
*/
- ADD_SIGNALS_DECL_WRAPPER(ShowProgress, void, const std::string& title, int nProgress, bool resume_possible);
+ btcsignals::signal<void(const std::string& title, int nProgress, bool resume_possible)> ShowProgress;
/** New block has been accepted */
- ADD_SIGNALS_DECL_WRAPPER(NotifyBlockTip, void, SynchronizationState, const CBlockIndex& block, double verification_progress);
+ btcsignals::signal<void(SynchronizationState, const CBlockIndex& block, double verification_progress)> NotifyBlockTip;
/** Best header has changed */
- ADD_SIGNALS_DECL_WRAPPER(NotifyHeaderTip, void, SynchronizationState, int64_t height, int64_t timestamp, bool presync);
+ btcsignals::signal<void(SynchronizationState, int64_t height, int64_t timestamp, bool presync)> NotifyHeaderTip;
/** Banlist did change. */
- ADD_SIGNALS_DECL_WRAPPER(BannedListChanged, void, void);
+ btcsignals::signal<void(void)> BannedListChanged;
};
/** Show warning message **/
diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp
index ac64876c..3e34c3ab 100644
--- a/src/node/interfaces.cpp
+++ b/src/node/interfaces.cpp
@@ -386,50 +386,50 @@ public:
}
std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) override
{
- return MakeSignalHandler(::uiInterface.InitMessage_connect(fn));
+ return MakeSignalHandler(::uiInterface.InitMessage.connect(fn));
}
std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn) override
{
- return MakeSignalHandler(::uiInterface.ThreadSafeMessageBox_connect(fn));
+ return MakeSignalHandler(::uiInterface.ThreadSafeMessageBox.connect(fn));
}
std::unique_ptr<Handler> handleQuestion(QuestionFn fn) override
{
- return MakeSignalHandler(::uiInterface.ThreadSafeQuestion_connect(fn));
+ return MakeSignalHandler(::uiInterface.ThreadSafeQuestion.connect(fn));
}
std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn) override
{
- return MakeSignalHandler(::uiInterface.ShowProgress_connect(fn));
+ return MakeSignalHandler(::uiInterface.ShowProgress.connect(fn));
}
std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn) override
{
- return MakeSignalHandler(::uiInterface.InitWallet_connect(fn));
+ return MakeSignalHandler(::uiInterface.InitWallet.connect(fn));
}
std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) override
{
- return MakeSignalHandler(::uiInterface.NotifyNumConnectionsChanged_connect(fn));
+ return MakeSignalHandler(::uiInterface.NotifyNumConnectionsChanged.connect(fn));
}
std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn) override
{
- return MakeSignalHandler(::uiInterface.NotifyNetworkActiveChanged_connect(fn));
+ return MakeSignalHandler(::uiInterface.NotifyNetworkActiveChanged.connect(fn));
}
std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn) override
{
- return MakeSignalHandler(::uiInterface.NotifyAlertChanged_connect(fn));
+ return MakeSignalHandler(::uiInterface.NotifyAlertChanged.connect(fn));
}
std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn) override
{
- return MakeSignalHandler(::uiInterface.BannedListChanged_connect(fn));
+ return MakeSignalHandler(::uiInterface.BannedListChanged.connect(fn));
}
std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn) override
{
- return MakeSignalHandler(::uiInterface.NotifyBlockTip_connect([fn](SynchronizationState sync_state, const CBlockIndex& block, double verification_progress) {
+ return MakeSignalHandler(::uiInterface.NotifyBlockTip.connect([fn](SynchronizationState sync_state, const CBlockIndex& block, double verification_progress) {
fn(sync_state, BlockTip{block.nHeight, block.GetBlockTime(), block.GetBlockHash()}, verification_progress);
}));
}
std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn) override
{
return MakeSignalHandler(
- ::uiInterface.NotifyHeaderTip_connect([fn](SynchronizationState sync_state, int64_t height, int64_t timestamp, bool presync) {
+ ::uiInterface.NotifyHeaderTip.connect([fn](SynchronizationState sync_state, int64_t height, int64_t timestamp, bool presync) {
fn(sync_state, BlockTip{(int)height, timestamp, uint256{}}, presync);
}));
}
diff --git a/src/noui.cpp b/src/noui.cpp
index b9c9e78b..2450fdda 100644
--- a/src/noui.cpp
+++ b/src/noui.cpp
@@ -56,9 +56,9 @@ void noui_InitMessage(const std::string& message)
void noui_connect()
{
- noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBox);
- noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestion);
- noui_InitMessageConn = uiInterface.InitMessage_connect(noui_InitMessage);
+ noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);
+ noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestion);
+ noui_InitMessageConn = uiInterface.InitMessage.connect(noui_InitMessage);
}
void noui_ThreadSafeMessageBoxRedirect(const bilingual_str& message, unsigned int style)
@@ -82,9 +82,9 @@ void noui_test_redirect()
noui_ThreadSafeMessageBoxConn.disconnect();
noui_ThreadSafeQuestionConn.disconnect();
noui_InitMessageConn.disconnect();
- noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBoxRedirect);
- noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestionRedirect);
- noui_InitMessageConn = uiInterface.InitMessage_connect(noui_InitMessageRedirect);
+ noui_ThreadSafeMessageBoxConn = uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBoxRedirect);
+ noui_ThreadSafeQuestionConn = uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestionRedirect);
+ noui_InitMessageConn = uiInterface.InitMessage.connect(noui_InitMessageRedirect);
}
void noui_reconnect()
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 40a60a26..97eb957c 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -485,9 +485,9 @@ int GuiMain(int argc, char* argv[])
util::ThreadSetInternalName("main");
// Subscribe to global signals from core
- btcsignals::scoped_connection handler_message_box{::uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBox)};
- btcsignals::scoped_connection handler_question{::uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestion)};
- btcsignals::scoped_connection handler_init_message{::uiInterface.InitMessage_connect(noui_InitMessage)};
+ btcsignals::scoped_connection handler_message_box{::uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox)};
+ btcsignals::scoped_connection handler_question{::uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestion)};
+ btcsignals::scoped_connection handler_init_message{::uiInterface.InitMessage.connect(noui_InitMessage)};
// Do not refer to data directory yet, this can be overridden by Intro::pickDataDirectory
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.