29.x: using a local libmultiprocess install will no-longer work #33576

issue fanquake openend this issue on October 8, 2025
  1. fanquake commented at 4:21 pm on October 8, 2025: member

    Given that the 29.x branch doesn’t have the changes to accomodate upstream changes in libmultiprocess, anyone who builds and installs libmultiprocess, and then tries to build Core with -DWITH_MULTIPROCESS=ON, will get a compile failure:

      0[ 34%] Building CXX object src/ipc/CMakeFiles/bitcoin_ipc.dir/capnp/protocol.cpp.o
      1/bitcoin/src/ipc/capnp/protocol.cpp: In destructor 'virtual ipc::capnp::{anonymous}::CapnpProtocol::~CapnpProtocol()':
      2/bitcoin/src/ipc/capnp/protocol.cpp:45:62: error: no matching function for call to 'std::unique_lock<std::mutex>::unique_lock(mp::Mutex&)'
      3   45 |             std::unique_lock<std::mutex> lock(m_loop->m_mutex);
      4      |                                                              ^
      5In file included from /usr/include/c++/13/mutex:46,
      6                 from /bitcoin/src/threadsafety.h:9,
      7                 from /bitcoin/src/logging.h:10,
      8                 from /bitcoin/src/interfaces/node.h:10,
      9                 from /bitcoin/src/interfaces/init.h:11,
     10                 from /bitcoin/src/ipc/capnp/protocol.cpp:5:
     11/usr/include/c++/13/bits/unique_lock.h:68:16: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(mutex_type&) [with _Mutex = std::mutex; mutex_type = std::mutex]'
     12   68 |       explicit unique_lock(mutex_type& __m)
     13      |                ^~~~~~~~~~~
     14/usr/include/c++/13/bits/unique_lock.h:68:40: note:   no known conversion for argument 1 from 'mp::Mutex' to 'std::unique_lock<std::mutex>::mutex_type&' {aka 'std::mutex&'}
     15   68 |       explicit unique_lock(mutex_type& __m)
     16      |                            ~~~~~~~~~~~~^~~
     17/usr/include/c++/13/bits/unique_lock.h:97:9: note: candidate: 'template<class _Rep, class _Period> std::unique_lock<_Mutex>::unique_lock(mutex_type&, const std::chrono::duration<_Rep, _Period>&) [with _Period = _Rep; _Mutex = std::mutex]'
     18   97 |         unique_lock(mutex_type& __m,
     19      |         ^~~~~~~~~~~
     20/usr/include/c++/13/bits/unique_lock.h:97:9: note:   template argument deduction/substitution failed:
     21/bitcoin/src/ipc/capnp/protocol.cpp:45:62: note:   candidate expects 2 arguments, 1 provided
     22   45 |             std::unique_lock<std::mutex> lock(m_loop->m_mutex);
     23      |                                                              ^
     24/usr/include/c++/13/bits/unique_lock.h:90:9: note: candidate: 'template<class _Clock, class _Duration> std::unique_lock<_Mutex>::unique_lock(mutex_type&, const std::chrono::time_point<_Clock, _Duration>&) [with _Duration = _Clock; _Mutex = std::mutex]'
     25   90 |         unique_lock(mutex_type& __m,
     26      |         ^~~~~~~~~~~
     27/usr/include/c++/13/bits/unique_lock.h:90:9: note:   template argument deduction/substitution failed:
     28/bitcoin/src/ipc/capnp/protocol.cpp:45:62: note:   candidate expects 2 arguments, 1 provided
     29   45 |             std::unique_lock<std::mutex> lock(m_loop->m_mutex);
     30      |                                                              ^
     31/usr/include/c++/13/bits/unique_lock.h:112:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(std::unique_lock<_Mutex>&&) [with _Mutex = std::mutex]'
     32  112 |       unique_lock(unique_lock&& __u) noexcept
     33      |       ^~~~~~~~~~~
     34/usr/include/c++/13/bits/unique_lock.h:112:33: note:   no known conversion for argument 1 from 'mp::Mutex' to 'std::unique_lock<std::mutex>&&'
     35  112 |       unique_lock(unique_lock&& __u) noexcept
     36      |                   ~~~~~~~~~~~~~~^~~
     37/usr/include/c++/13/bits/unique_lock.h:83:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(mutex_type&, std::adopt_lock_t) [with _Mutex = std::mutex; mutex_type = std::mutex]'
     38   83 |       unique_lock(mutex_type& __m, adopt_lock_t) noexcept
     39      |       ^~~~~~~~~~~
     40/usr/include/c++/13/bits/unique_lock.h:83:7: note:   candidate expects 2 arguments, 1 provided
     41/usr/include/c++/13/bits/unique_lock.h:79:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(mutex_type&, std::try_to_lock_t) [with _Mutex = std::mutex; mutex_type = std::mutex]'
     42   79 |       unique_lock(mutex_type& __m, try_to_lock_t)
     43      |       ^~~~~~~~~~~
     44/usr/include/c++/13/bits/unique_lock.h:79:7: note:   candidate expects 2 arguments, 1 provided
     45/usr/include/c++/13/bits/unique_lock.h:75:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(mutex_type&, std::defer_lock_t) [with _Mutex = std::mutex; mutex_type = std::mutex]'
     46   75 |       unique_lock(mutex_type& __m, defer_lock_t) noexcept
     47      |       ^~~~~~~~~~~
     48/usr/include/c++/13/bits/unique_lock.h:75:7: note:   candidate expects 2 arguments, 1 provided
     49/usr/include/c++/13/bits/unique_lock.h:64:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock() [with _Mutex = std::mutex]'
     50   64 |       unique_lock() noexcept
     51      |       ^~~~~~~~~~~
     52/usr/include/c++/13/bits/unique_lock.h:64:7: note:   candidate expects 0 arguments, 1 provided
     53/bitcoin/src/ipc/capnp/protocol.cpp:46:21: error: 'class mp::EventLoop' has no member named 'removeClient'
     54   46 |             m_loop->removeClient(lock);
     55      |                     ^~~~~~~~~~~~
     56/bitcoin/src/ipc/capnp/protocol.cpp: In lambda function:
     57/bitcoin/src/ipc/capnp/protocol.cpp:87:66: error: no matching function for call to 'std::unique_lock<std::mutex>::unique_lock(mp::Mutex&)'
     58   87 |                 std::unique_lock<std::mutex> lock(m_loop->m_mutex);
     59      |                                                                  ^
     60/usr/include/c++/13/bits/unique_lock.h:68:16: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(mutex_type&) [with _Mutex = std::mutex; mutex_type = std::mutex]'
     61   68 |       explicit unique_lock(mutex_type& __m)
     62      |                ^~~~~~~~~~~
     63/usr/include/c++/13/bits/unique_lock.h:68:40: note:   no known conversion for argument 1 from 'mp::Mutex' to 'std::unique_lock<std::mutex>::mutex_type&' {aka 'std::mutex&'}
     64   68 |       explicit unique_lock(mutex_type& __m)
     65      |                            ~~~~~~~~~~~~^~~
     66/usr/include/c++/13/bits/unique_lock.h:97:9: note: candidate: 'template<class _Rep, class _Period> std::unique_lock<_Mutex>::unique_lock(mutex_type&, const std::chrono::duration<_Rep, _Period>&) [with _Period = _Rep; _Mutex = std::mutex]'
     67   97 |         unique_lock(mutex_type& __m,
     68      |         ^~~~~~~~~~~
     69/usr/include/c++/13/bits/unique_lock.h:97:9: note:   template argument deduction/substitution failed:
     70/bitcoin/src/ipc/capnp/protocol.cpp:87:66: note:   candidate expects 2 arguments, 1 provided
     71   87 |                 std::unique_lock<std::mutex> lock(m_loop->m_mutex);
     72      |                                                                  ^
     73/usr/include/c++/13/bits/unique_lock.h:90:9: note: candidate: 'template<class _Clock, class _Duration> std::unique_lock<_Mutex>::unique_lock(mutex_type&, const std::chrono::time_point<_Clock, _Duration>&) [with _Duration = _Clock; _Mutex = std::mutex]'
     74   90 |         unique_lock(mutex_type& __m,
     75      |         ^~~~~~~~~~~
     76/usr/include/c++/13/bits/unique_lock.h:90:9: note:   template argument deduction/substitution failed:
     77/bitcoin/src/ipc/capnp/protocol.cpp:87:66: note:   candidate expects 2 arguments, 1 provided
     78   87 |                 std::unique_lock<std::mutex> lock(m_loop->m_mutex);
     79      |                                                                  ^
     80/usr/include/c++/13/bits/unique_lock.h:112:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(std::unique_lock<_Mutex>&&) [with _Mutex = std::mutex]'
     81  112 |       unique_lock(unique_lock&& __u) noexcept
     82      |       ^~~~~~~~~~~
     83/usr/include/c++/13/bits/unique_lock.h:112:33: note:   no known conversion for argument 1 from 'mp::Mutex' to 'std::unique_lock<std::mutex>&&'
     84  112 |       unique_lock(unique_lock&& __u) noexcept
     85      |                   ~~~~~~~~~~~~~~^~~
     86/usr/include/c++/13/bits/unique_lock.h:83:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(mutex_type&, std::adopt_lock_t) [with _Mutex = std::mutex; mutex_type = std::mutex]'
     87   83 |       unique_lock(mutex_type& __m, adopt_lock_t) noexcept
     88      |       ^~~~~~~~~~~
     89/usr/include/c++/13/bits/unique_lock.h:83:7: note:   candidate expects 2 arguments, 1 provided
     90/usr/include/c++/13/bits/unique_lock.h:79:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(mutex_type&, std::try_to_lock_t) [with _Mutex = std::mutex; mutex_type = std::mutex]'
     91   79 |       unique_lock(mutex_type& __m, try_to_lock_t)
     92      |       ^~~~~~~~~~~
     93/usr/include/c++/13/bits/unique_lock.h:79:7: note:   candidate expects 2 arguments, 1 provided
     94/usr/include/c++/13/bits/unique_lock.h:75:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock(mutex_type&, std::defer_lock_t) [with _Mutex = std::mutex; mutex_type = std::mutex]'
     95   75 |       unique_lock(mutex_type& __m, defer_lock_t) noexcept
     96      |       ^~~~~~~~~~~
     97/usr/include/c++/13/bits/unique_lock.h:75:7: note:   candidate expects 2 arguments, 1 provided
     98/usr/include/c++/13/bits/unique_lock.h:64:7: note: candidate: 'std::unique_lock<_Mutex>::unique_lock() [with _Mutex = std::mutex]'
     99   64 |       unique_lock() noexcept
    100      |       ^~~~~~~~~~~
    101/usr/include/c++/13/bits/unique_lock.h:64:7: note:   candidate expects 0 arguments, 1 provided
    102/bitcoin/src/ipc/capnp/protocol.cpp:88:25: error: 'class mp::EventLoop' has no member named 'addClient'
    103   88 |                 m_loop->addClient(lock);
    104      |                         ^~~~~~~~~
    105gmake[2]: *** [src/ipc/CMakeFiles/bitcoin_ipc.dir/build.make:178: src/ipc/CMakeFiles/bitcoin_ipc.dir/capnp/protocol.cpp.o] Error 1
    106gmake[1]: *** [CMakeFiles/Makefile2:1208: src/ipc/CMakeFiles/bitcoin_ipc.dir/all] Error 2
    107gmake: *** [Makefile:146: all] Error 2
    

    Unless we backport a number of ipc related changes to this branch (unlikely), this will be broken for the rest of this branches life. This seems like something we might want to document.

  2. fanquake added the label Build system on Oct 8, 2025
  3. fanquake added the label interfaces on Oct 8, 2025
  4. fanquake commented at 4:21 pm on October 8, 2025: member
  5. Sjors commented at 4:55 pm on October 8, 2025: member
    Maybe we should tag the last libmultiprocess commit that is expected to work with 29.x and recommend that in either the libmultiprocess README or backported documentation here?
  6. ryanofsky commented at 4:55 pm on October 8, 2025: contributor

    Unless we backport a number of ipc related changes to this branch (unlikely), this will be broken for the rest of this branches lief. This seems like something we might want to document.

    This does seem like something good to document. Maybe the 29.x dependencies.md file could document the version of multiprocess known to work with v29, consistent with the version used in depends https://github.com/bitcoin/bitcoin/blob/8bcb90d7e3cd80db3d24e29ed8c72a55fcba90bc/depends/packages/native_libmultiprocess.mk#L2.

    Could also create branches and tags in the libmultiprocess repo to provide clearer versioning. Maybe v0 for the branch that works with bitcoin 29, v1 for the branch that works with bitcoin 30.0, etc. Libmultiprocess versions and bitcoin major versions would not necessarily increase in lockstep since libmultiprocess API should be be pretty stable and not need to increase with every new bitcoin release, and conversely there could also be libmultiprocess API changes that are not backwards compatible made between bitcoin minor versions.

  7. maflcko commented at 11:07 am on October 9, 2025: member

    This does seem like something good to document. Maybe the 29.x dependencies.md file could document the version of multiprocess known to work with v29, consistent with the version used in depends

    Yeah, makes sense to document this. (Looks like it isn’t documented at all right now). Just documenting the exact commit should be good enough and I think tagging isn’t needed, but no strong opinion.

  8. maflcko added the label Docs on Oct 9, 2025

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2025-10-10 15:13 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me