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
Internal c++ interfaces
The following interfaces are defined here:
-
Chain— used by wallet to access blockchain and mempool state. Added in #14437, #14711, #15288, and #10973. -
ChainClient— used by node to start & stopChainclients. Added in #14437. -
Node— used by GUI to start & stop bitcoin node. Added in #10244. -
Handler— returned byhandleEventmethods on interfaces above and used to manage lifetimes of event handlers. -
Init— used by multiprocess code to access interfaces above on startup. Added in #19160. -
Ipc— used by multiprocess code to accessInitinterface across processes. Added in #19160. -
Rpc— used bybitcoin-clito be able to call RPC methods over a unix socket instead of TCP.
The interfaces above define boundaries between major components of bitcoin code (node, wallet, and gui), making it possible for them to run in different processes, and be tested, developed, and understood independently. These interfaces are not currently designed to be stable or to be used externally.