shutdown bugfix: Prevent segfault in server if connection is broken during long function call#118
Conversation
…s during method call Fix issue where if a client disconnects in the middle of a long running IPC method call, the server will segfault when the method eventually returns. This behavior was reported by tdb3 in bitcoin/bitcoin#31003 (review) including a stack trace showing where the crash happens in the PassField mp.Context overload while calling request_threads.erase.
|
Originally posted by @tdb3 in bitcoin/bitcoin#31003 (review):
|
Add recent changes and fixes for shutdown bugs: bitcoin-core/libmultiprocess#111: doc: Add internal design section bitcoin-core/libmultiprocess#113: Add missing include to util.h bitcoin-core/libmultiprocess#116: shutdown bugfix: destroy RPC system before running cleanup callbacks bitcoin-core/libmultiprocess#118: shutdown bugfix: Prevent segfault in server if connection is broken during long function call
Add recent changes and fixes for shutdown bugs: bitcoin-core/libmultiprocess#111: doc: Add internal design section bitcoin-core/libmultiprocess#113: Add missing include to util.h bitcoin-core/libmultiprocess#116: shutdown bugfix: destroy RPC system before running cleanup callbacks bitcoin-core/libmultiprocess#118: shutdown bugfix: Prevent segfault in server if connection is broken during long function call
|
Still encountering a segfault. Trace below. |
|
Following the instructions from bitcoin/bitcoin#31003 (review) (complicated but steps to reproduce were described very clearly!) I was able to reproduce the original segfault and a new segfault after applying the current fix 7f1d33f Will debug, but stack trace is: #0 std::operator== (__x=..., __y=...) at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/std_thread.h:330
#1 mp::EventLoop::post(std::function<void ()> const&) (this=0x0, fn=...) at /home/russ/work/mp/src/mp/proxy.cpp:219
#2 0x000055ac4fc57dc4 in mp::EventLoop::sync<mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}::operator()()::{lambda()#3}::operator()() const::{lambda()#1}>(mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}::operator()()::{lambda()#3}::operator()() const::{lambda()#1}&&) (this=0x0, callable=...) at /home/russ/work/mp/build/prefix/include/mp/proxy-io.h:155
#3 0x000055ac4fc57d44 in mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}::operator()()::{lambda()#3}::operator()() const (this=0x7f1c4affc7e8) at /home/russ/work/mp/build/prefix/include/mp/proxy-types.h:171
#4 0x000055ac4fc52267 in kj::runCatchingExceptions<mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}::operator()()::{lambda()#3}>(mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}::operator()()::{lambda()#3}&&) (func=...) at /nix/store/0rvzw1dahhd1h8qyhyxmwgr2l745fn3a-capnproto-1.0.2/include/kj/exception.h:371
#5 0x000055ac4fc51db9 in mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}::operator()() (this=0x7f1c8001c4d0) at /home/russ/work/mp/build/prefix/include/mp/proxy-types.h:171
#6 0x000055ac4fc51afe in mp::AsyncCallable<mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}>::operator()() const (this=0x7f1c8001c440) at /home/russ/work/mp/build/prefix/include/mp/util.h:189
#7 0x000055ac4fc51aa6 in std::__invoke_impl<void, mp::AsyncCallable<mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}>&>(std::__invoke_other, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&&) (__f=...) at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/invoke.h:61
#8 0x000055ac4fc519f6 in std::__invoke_r<void, mp::AsyncCallable<mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}>&>(mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&&) (__fn=...) at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/invoke.h:111
#9 0x000055ac4fc5182e in std::_Function_handler<void (), mp::AsyncCallable<mp::PassField<mp::Accessor<mp::mining_fields::Context, 17>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > >, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > > >(mp::Priority<1>, mp::TypeList<>, mp::ServerInvokeContext<mp::ProxyServer<ipc::capnp::messages::Mining>, capnp::CallContext<ipc::capnp::messages::Mining::WaitFeesChangedParams, ipc::capnp::messages::Mining::WaitFeesChangedResults> >&, mp::ServerField<1, mp::Accessor<mp::mining_fields::CurrentTip, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::FeeThreshold, 1>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Options, 17>, mp::ServerField<1, mp::Accessor<mp::mining_fields::Timeout, 1>, mp::ServerRet<mp::Accessor<mp::mining_fields::Result, 2>, mp::ServerCall> > > > > const&, mp::TypeList<uint256, long, node::BlockCreateOptions const&, std::chrono::duration<double, std::ratio<1l, 1000l> > >&&)::{lambda()#1}> >::_M_invoke(std::_Any_data const&) (__functor=...)
at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/std_function.h:290
#10 0x000055ac5016f360 in std::function<void ()>::operator()() const (this=<optimized out>) at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/std_function.h:591
#11 mp::Waiter::wait<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const::{lambda()#1}>(std::unique_lock<std::mutex>&, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const::{lambda()#1})::{lambda()#1}::operator()() const (this=<optimized out>) at /home/russ/work/mp/include/mp/proxy-io.h:261
#12 std::condition_variable::wait<mp::Waiter::wait<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const::{lambda()#1}>(std::unique_lock<std::mutex>&, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const::{lambda()#1})::{lambda()#1}>(std::unique_lock<std::mutex>&, mp::Waiter::wait<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const::{lambda()#1}>(std::unique_lock<std::mutex>&, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const::{lambda()#1})::{lambda()#1}) (this=0x7f1c44001278, __lock=..., __p=...) at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/condition_variable:104
#13 mp::Waiter::wait<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const::{lambda()#1}>(std::unique_lock<std::mutex>&, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const::{lambda()#1}) (this=0x7f1c44001250, lock=..., pred=...) at /home/russ/work/mp/include/mp/proxy-io.h:251
#14 mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0::operator()() const (this=<optimized out>) at /home/russ/work/mp/src/mp/proxy.cpp:364
#15 std::__invoke_impl<void, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>(std::__invoke_other, mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0&&) (__f=...) at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/invoke.h:61
#16 std::__invoke<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0>(mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0&&) (__fn=...) at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/invoke.h:96
#17 std::thread::_Invoker<std::tuple<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) (this=<optimized out>)
at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/std_thread.h:292
#18 std::thread::_Invoker<std::tuple<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0> >::operator()() (this=<optimized out>)
at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/std_thread.h:299
#19 std::thread::_State_impl<std::thread::_Invoker<std::tuple<mp::ProxyServer<mp::ThreadMap>::makeThread(capnp::CallContext<mp::ThreadMap::MakeThreadParams, mp::ThreadMap::MakeThreadResults>)::$_0> > >::_M_run() (this=<optimized out>)
at /nix/store/rqga421d43q40blrrgmiw820p01a4nba-gcc-13.2.0/include/c++/13.2.0/bits/std_thread.h:244
#20 0x00007f1c90ee8683 in execute_native_thread_routine () from /nix/store/agp6lqznayysqvqkx4k1ggr8n1rsyi8c-gcc-13.2.0-lib/lib/libstdc++.so.6
#21 0x00007f1c90bc0383 in start_thread () from /nix/store/1rm6sr6ixxzipv5358x0cmaw8rs84g2j-glibc-2.38-44/lib/libc.so.6
#22 0x00007f1c90c4300c in clone3 () from /nix/store/1rm6sr6ixxzipv5358x0cmaw8rs84g2j-glibc-2.38-44/lib/libc.so.6 |
…cts during method call This an imperfect workaround for a crash that can be triggered if a client disconnects in the middle of a long running IPC call. The workaround results in memory leak but avoids a crash. This can be improved later, and more details are in a code comment.
|
The second crash turned out to be more complicated to fix than the first one, so just pushing a workaround for now that avoids the crash but results in a small memory leak. I will open a separate PR with a more complete fix. I should also add a test for this issue making sure deleting server-side Connection* during an ongoing method call does not cause crashes. |
Add recent changes and fixes for shutdown bugs. bitcoin-core/libmultiprocess#111: doc: Add internal design section bitcoin-core/libmultiprocess#113: Add missing include to util.h bitcoin-core/libmultiprocess#116: shutdown bugfix: destroy RPC system before running cleanup callbacks bitcoin-core/libmultiprocess#118: shutdown bugfix: Prevent segfault in server if connection is broken during long function call bitcoin-core/libmultiprocess#119: cmake: avoid libatomic not found error on debian
90b4055 Update libmultiprocess library (Ryan Ofsky) Pull request description: Add recent changes and fixes for shutdown bugs. bitcoin-core/libmultiprocess#111: doc: Add internal design section bitcoin-core/libmultiprocess#113: Add missing include to util.h bitcoin-core/libmultiprocess#116: shutdown bugfix: destroy RPC system before running cleanup callbacks bitcoin-core/libmultiprocess#118: shutdown bugfix: Prevent segfault in server if connection is broken during long function call bitcoin-core/libmultiprocess#119: cmake: avoid libatomic not found error on debian ACKs for top commit: fanquake: ACK 90b4055 TheCharlatan: ACK 90b4055 Tree-SHA512: 2c256667f0c16e00bb5a81b2c6d3db103fae211844e32b111bbed673ab2612ad1478e6b3ecd3a867a4e425cfa6e778b67388343626597a8fac800a15cea5e53a
Add recent changes and fixes for shutdown bugs. bitcoin-core/libmultiprocess#111: doc: Add internal design section bitcoin-core/libmultiprocess#113: Add missing include to util.h bitcoin-core/libmultiprocess#116: shutdown bugfix: destroy RPC system before running cleanup callbacks bitcoin-core/libmultiprocess#118: shutdown bugfix: Prevent segfault in server if connection is broken during long function call bitcoin-core/libmultiprocess#119: cmake: avoid libatomic not found error on debian
This reverts commit 196e6fc from bitcoin-core#118 which added a workaround which is no longer needed after 315ff53 from bitcoin-core#160 When the workaround was introduced it prevented segfaults that happened when an IPC client disconnected during a long-running asynchronous call by leaking server objects instead of crashing. These leaks could sometimes cause the new "disconnecting and blocking" unit test introduced in bitcoin-core#160 to hang, and since the workaround is no longer necessary, the fix is to revert it. The problem with the hanged test was reported: - Sjors/bitcoin#90 (comment) - https://github.com/Sjors/bitcoin/actions/runs/15966265407/job/45027248310?pr=90 - Sjors/bitcoin#90 (comment) - https://cirrus-ci.com/task/4999408900636672 And the fix was posted: - Sjors/bitcoin#90 (comment)
This reverts commit 196e6fc from bitcoin-core#118 which added a workaround which is no longer needed after 315ff53 from bitcoin-core#160 When the workaround was introduced it prevented segfaults that happened when an IPC client disconnected during a long-running asynchronous call. But it prevented them by leaking server objects, and these leaks now sometimes cause the new "disconnecting and blocking" unit test introduced in bitcoin-core#160 to hang. Since the workaround is no longer necessary, revert it now to fix the test hangs. The problem with test hangs was reported: - Sjors/bitcoin#90 (comment) - https://github.com/Sjors/bitcoin/actions/runs/15966265407/job/45027248310?pr=90 - Sjors/bitcoin#90 (comment) - https://cirrus-ci.com/task/4999408900636672 And the fix was posted: - Sjors/bitcoin#90 (comment)
Note: this is done now. The second commit of this PR was reverted in #186. The workaround was no longer needed after #160, and it was actually causing intermittent test hangs in the new unit test added in #160 disconnecting the client during an IPC call. |
27ada40809 build: move library sources under lib/ for subtree split REVERT: 3c69d125a1 Merge bitcoin-core/libmultiprocess#260: event loop: tolerate unexpected exceptions in `post()` callbacks REVERT: b8a48c65e6 event loop: tolerate unexpected exceptions in `post()` callbacks REVERT: f787863d2c Merge bitcoin-core/libmultiprocess#270: doc: Bump version 10 > 11 REVERT: a22f602910 doc: Bump version 10 > 11 REVERT: 3edbe8f67c Merge bitcoin-core/libmultiprocess#268: Use throwRecoverableException instead of raw throw for stored exceptions REVERT: 23be44b0d3 Use throwRecoverableException instead of raw throw for stored exceptions REVERT: 75c2a2764c Merge bitcoin-core/libmultiprocess#266: test: increase spawn test child timeout to 30 seconds REVERT: 8b5f805301 Merge bitcoin-core/libmultiprocess#267: doc: Bump version 9 > 10 REVERT: cc0b23fc32 test: increase spawn test child timeout to 30 seconds REVERT: 050f878db8 doc: Improve versions.md descriptions and formatting REVERT: c6a288a889 doc: Bump version 9 > 10 REVERT: 70f632bda8 Merge bitcoin-core/libmultiprocess#265: ci: set LC_ALL in shell scripts REVERT: 8e8e564259 Merge bitcoin-core/libmultiprocess#249: fixes for race conditions on disconnects REVERT: 05d34cc2ec ci: set LC_ALL in shell scripts REVERT: e606fd84a8 Merge bitcoin-core/libmultiprocess#264: ci: reduce nproc multipliers REVERT: ff0eed1bf1 refactor: Use loop variable in type-context.h REVERT: ff1d8ba172 refactor: Move type-context.h getParams() call closer to use REVERT: 1dbc59a4aa race fix: m_on_cancel called after request finishes REVERT: 1643d05ba0 test: m_on_cancel called after request finishes REVERT: f5509a31fc race fix: getParams() called after request cancel REVERT: 4a60c39f24 test: getParams() called after request cancel REVERT: f11ec29ed2 race fix: worker thread destroyed before it is initialized REVERT: a1d643348f test: worker thread destroyed before it is initialized REVERT: 336023382c ci: reduce nproc multipliers REVERT: b090beb965 Merge bitcoin-core/libmultiprocess#256: ci: cache gnu32 nix store REVERT: be8622816d ci: cache gnu32 nix store REVERT: 975270b619 Merge bitcoin-core/libmultiprocess#263: ci: bump timeout factor to 40 REVERT: 09f10e5a59 ci: bump timeout factor to 40 REVERT: db8f76ad29 Merge bitcoin-core/libmultiprocess#253: ci: run some Bitcoin Core CI jobs REVERT: 55a9b557b1 ci: set Bitcoin Core CI test repetition REVERT: fb0fc84d55 ci: add TSan job with instrumented libc++ REVERT: 0f29c38725 ci: add Bitcoin Core IPC tests (ASan + macOS) REVERT: 3f64320315 Merge bitcoin-core/libmultiprocess#262: ci: enable clang-tidy in macOS job, use nullptr REVERT: cd9f8bdc9f Merge bitcoin-core/libmultiprocess#258: log: add socket connected info message and demote destroy logs to debug REVERT: b5d6258a42 Merge bitcoin-core/libmultiprocess#255: fix: use unsigned char cast and sizeof in LogEscape escape sequence REVERT: d94688e2c3 Merge bitcoin-core/libmultiprocess#251: Improved CustomBuildField for std::optional in IPC/libmultiprocess REVERT: a9499fad75 mp: use nullptr with pthread_threadid_np REVERT: f499e37850 ci: enable clang-tidy in macOS job REVERT: 98f1352159 log: add socket connected info message and demote destroy logs to debug REVERT: 554a481ea7 fix: use unsigned char cast and sizeof in LogEscape escape sequence REVERT: 1977b9f3f6 Use std::forward in CustomBuildField for std::optional to allow move semantics, resolves FIXME REVERT: 22bec918c9 Merge bitcoin-core/libmultiprocess#247: type-map: Work around LLVM 22 "out of bounds index" error REVERT: 8a5e3ae6ed Merge bitcoin-core/libmultiprocess#242: proxy-types: add CustomHasField hook to map Cap'n Proto values to null C++ values REVERT: e8d3524691 Merge bitcoin-core/libmultiprocess#246: doc: Bump version 8 > 9 REVERT: 97d877053b proxy-types: add CustomHasField hook for nullable decode paths REVERT: 8c2f10252c refactor: add missing includes to mp/type-data.h REVERT: b1638aceb4 doc: Bump version 8 > 9 REVERT: f61af48721 type-map: Work around LLVM 22 "out of bounds index" error REVERT: 1868a84451 Merge bitcoin-core/libmultiprocess#245: type-context.h: Extent cancel_mutex lock to prevent theoretical race REVERT: fd4a90d310 Merge bitcoin-core/libmultiprocess#244: ci: suppress two tidy lint issues REVERT: 16dfc36864 ci: avoid bugprone-unused-return-value lint in test REVERT: dacd5eda46 ci: suppress nontrivial-threadlocal lint in proxy.cpp REVERT: ef96a5b2be doc: Comment cleanups after bitcoin#240 REVERT: e0f1cd7621 type-context.h: Extent cancel_mutex lock to prevent theoretical race REVERT: 290702c74c Merge bitcoin-core/libmultiprocess#240: Avoid errors from asynchronous (non-c++) clients REVERT: 3a69d4755a Merge bitcoin-core/libmultiprocess#241: doc: Bump version number v7 -> v8 REVERT: 0174450ca2 Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer REVERT: ddb5f74196 Allow simultaneous calls on same Context.thread REVERT: c4762c7b51 refactor: Add ProxyServer<Thread>::post() method REVERT: 0ade1b40ac doc: Bump version number REVERT: 1fc65008f7 Merge bitcoin-core/libmultiprocess#237: Made SpawnProcess() behavior safe post fork() REVERT: 5205a87cd9 test: check SpawnProcess post-fork safety REVERT: 69652f0edf Precompute argv before fork in SpawnProcess REVERT: 30a8681de6 SpawnProcess: avoid fd leak on close failure REVERT: d0fc1081d0 Merge bitcoin-core/libmultiprocess#196: ci: Add NetBSD job REVERT: 7b171f45bf Merge bitcoin-core/libmultiprocess#234: doc: Fix typos and grammar in documentation and comments REVERT: 861da39cae ci: Add NetBSD job REVERT: 458745e394 Fix various typos, spelling mistakes, and grammatical errors in design.md and source code comments. REVERT: 585decc856 Merge bitcoin-core/libmultiprocess#236: ci: Install binary package `capnproto` on OpenBSD instead of building it REVERT: 14e926a3ff refactor: extract MakeArgv helper REVERT: 1ee909393f ci: Install binary package `capnproto` on OpenBSD instead of building it REVERT: 470fc518d4 Merge bitcoin-core/libmultiprocess#230: cmake: add ONLY_CAPNP target_capnp_sources option REVERT: 2d8886f26c Merge bitcoin-core/libmultiprocess#228: Add versions.md and version.h files describing version branches and tags REVERT: c1838be565 Merge bitcoin-core/libmultiprocess#225: Improve and document act support REVERT: a173f1704c Merge bitcoin-core/libmultiprocess#223: ci: Replace nix-shell with equivalent nix develop command REVERT: 625eaca42f Merge bitcoin-core/libmultiprocess#229: Design Documentation Update REVERT: cc234be73a Design doc update REVERT: 81c652687b cmake: add ONLY_CAPNP target_capnp_sources option REVERT: 6e01d2d766 Add versions.md and version.h files describing version branches and tags REVERT: a4f9296964 Merge bitcoin-core/libmultiprocess#224: doc: fix typos REVERT: f4344ae87d Merge bitcoin-core/libmultiprocess#222: test, ci: Fix threadsanitizer errors in mptest REVERT: 4e3f8fa0d2 doc: add instructions for using act REVERT: 81712ff6bb ci: disable KVM and sandbox inside act containers REVERT: 1434642b38 doc: fix typos REVERT: 73d22ba2e9 test: Fix tsan race in thread busy test REVERT: b74e1bba01 ci: Use tsan-instrumented cap'n proto in sanitizers job REVERT: c332774409 test: Fix failing exception check in new thread busy test REVERT: ca3c05d567 test: Use KJ_LOG instead of std::cout for logging REVERT: 7eb1da120a ci: Use tsan-instrumented libcxx in sanitizers job REVERT: 18a2237a8e ci: Replace nix-shell with equivalent nix develop command REVERT: ec86e4336e Merge bitcoin-core/libmultiprocess#220: Add log levels and advertise them to users via logging callback REVERT: 515ce93ad3 Logging: Pass LogData struct to logging callback REVERT: 213574ccc4 Logging: reclassify remaining log messages REVERT: e4de0412b4 Logging: Break out expensive log messages and classify them as Trace REVERT: 408874a78f Logging: Use new logging macros REVERT: 67b092d835 Logging: Disable logging if messsage level is less than the requested level REVERT: d0a1ba7ebf Logging: add log levels to mirror Core's REVERT: 463a8296d1 Logging: Disable moving or copying Logger REVERT: 83a2e10c0b Logging: Add an EventLoop constructor to allow for user-specified log options REVERT: 58cf47a7fc Merge bitcoin-core/libmultiprocess#221: test default PassField impl handles output parameters REVERT: db03a663f5 Merge bitcoin-core/libmultiprocess#214: Fix crash on simultaneous IPC calls using the same thread REVERT: afcc40b0f1 Merge bitcoin-core/libmultiprocess#213: util+doc: Clearer errors when attempting to run examples + polished docs REVERT: 6db6696283 test In|Out parameter REVERT: 29cf2ada75 test default PassField impl handles output parameters REVERT: 1238170f68 test: simultaneous IPC calls using same thread REVERT: eb069ab75d Fix crash on simultaneous IPC calls using the same thread REVERT: ec03a9639a doc: Precision and typos REVERT: 2b43481935 doc: Where possible, remove links to ryanofsky/bitcoin/ REVERT: 286fe469c9 util: Add helpful error message when failing to execute file REVERT: 47d79db8a5 Merge bitcoin-core/libmultiprocess#201: bug: fix mptest hang, ProxyClient<Thread> deadlock in disconnect handler REVERT: f15ae9c9b9 Merge bitcoin-core/libmultiprocess#211: Add .gitignore REVERT: 4a269b21b8 bug: fix ProxyClient<Thread> deadlock if disconnected as IPC call is returning REVERT: 85df96482c Use try_emplace in SetThread instead of threads.find REVERT: ca9b380ea9 Use std::optional in ConnThreads to allow shortening locks REVERT: 9b07991135 doc: describe ThreadContext struct and synchronization requirements REVERT: d60db601ed proxy-io.h: add Waiter::m_mutex thread safety annotations REVERT: 4e365b019a ci: Use -Wthread-safety not -Wthread-safety-analysis REVERT: 15d7bafbb0 Add .gitignore REVERT: fe1cd8c761 Merge bitcoin-core/libmultiprocess#208: ci: Test minimum cmake version in olddeps job REVERT: b713a0b7bf Merge bitcoin-core/libmultiprocess#207: ci: output CMake version in CI script REVERT: 0f580397c9 ci: Test minimum cmake version in olddeps job REVERT: d603dcc0ee ci: output CMake version in CI script REVERT: 13424cf2ec Merge bitcoin-core/libmultiprocess#205: cmake: check for Cap'n Proto / Clang / C++20 incompatibility REVERT: 72dce11864 Merge bitcoin-core/libmultiprocess#200: event loop: add LogOptions struct and reduce the log size REVERT: 85003409f9 eventloop: add `LogOptions` struct REVERT: 657d80622f cmake: capnproto pkg missing helpful error REVERT: d314057775 cmake: check for Cap'n Proto / Clang / C++20 incompatibility REVERT: 878e84dc30 Merge bitcoin-core/libmultiprocess#203: cmake: search capnproto in package mode only REVERT: 1a85da5873 Merge bitcoin-core/libmultiprocess#202: doc: correct the build instructions for the example REVERT: df01873e1e Merge bitcoin-core/libmultiprocess#197: ci: Add freebsd and macos build REVERT: 3bee07ab33 cmake: search capnproto in package mode only REVERT: b6d3dc4419 doc: correct the build instructions for example REVERT: fa1ac30000 ci: Add macos and freebsd task REVERT: 1b8d4a6f1e Merge bitcoin-core/libmultiprocess#194: mpgen: Work around c++20 / capnproto 0.8 incompatibility REVERT: f1fad396bf Merge bitcoin-core/libmultiprocess#195: ci: Add openbsd REVERT: eed42f210d ci: Bump all tasks to actions/checkout@v5 REVERT: 486a510bbe ci: Remove ancient and problematic -lstdc++fs in mpexample REVERT: dd40897efe Add missing thread include REVERT: 98414e7d28 ci: Add openbsd REVERT: dc3ba22046 cmake, doc: Add check for CVE-2022-46149 REVERT: cb170d4913 Merge bitcoin-core/libmultiprocess#193: build: require CapnProto 0.7.0 or better REVERT: 8ceeaa6ae4 ci: Add olddeps job to test old dependencies versions REVERT: c4cb758ecc mpgen: Work around c++20 / capnproto 0.8 incompatibility REVERT: 30930dff7b build: require CapnProto 0.7.0 or better REVERT: b4120d34ba Merge bitcoin-core/libmultiprocess#192: doc: fix typos REVERT: 6ecbdcd35a doc: fix typos REVERT: a11e6905c2 Merge bitcoin-core/libmultiprocess#186: Fix mptest failures in bitcoin CI REVERT: 6f340a583f doc: fix DrahtBot LLM Linter error REVERT: c6f7fdf173 type-context: revert client disconnect workaround REVERT: e09143d2ea proxy-types: fix UndefinedBehaviorSanitizer: null-pointer-use REVERT: 84b292fcc4 mptest: fix MemorySanitizer: use-of-uninitialized-value REVERT: fe4a188803 proxy-io: fix race conditions in disconnect callback code REVERT: d8011c8360 proxy-io: fix race conditions in ProxyClientBase cleanup handler REVERT: 97e82ce19c doc: Add note about Waiter::m_mutex and interaction with the EventLoop::m_mutex REVERT: 81d58f5580 refactor: Rename ProxyClient cleanup_it variable REVERT: 07230f259f refactor: rename ProxyClient<Thread>::m_cleanup_it REVERT: c0efaa5e8c Merge bitcoin-core/libmultiprocess#187: ci: have bash scripts explicitly opt out of locale dependence. REVERT: 0d986ff144 mptest: fix race condition in TestSetup constructor REVERT: d2f6aa2e84 ci: add thread sanitizer job REVERT: 3a6db38e56 ci: rename configs to .bash REVERT: 401e0ce1d9 ci: add copyright to bash scripts REVERT: e956467ae4 ci: export LC_ALL REVERT: 8954cc0377 Merge bitcoin-core/libmultiprocess#184: Add CI jobs and fix clang-tidy and iwyu errors REVERT: 757e13a755 ci: add gnu32 cross-compiled 32-bit build REVERT: 15bf349000 doc: fix typo found by DrahtBot REVERT: 1a598d5905 clang-tidy: drop 'bitcoin-*' check REVERT: cbb1e43fdc ci: test libc++ instead of libstdc++ in one job REVERT: 76313450c2 type-context: disable clang-tidy UndefinedBinaryOperatorResult error REVERT: 4896e7fe51 proxy-types: fix clang-tidy EnumCastOutOfRange error REVERT: 060a739269 proxy-types: fix clang-tidy StackAddressEscape error REVERT: 977d721020 ci: add github actions jobs testing gcc, clang-20, clang-tidy, and iwyu REVERT: 0d5f1faae5 iwyu: fix add/remove include errors REVERT: 753d2b10cc util: fix clang-tidy modernize-use-equals-default error REVERT: ae4f1dc2bb type-number: fix clang-tidy modernize-use-nullptr error REVERT: 07a741bf69 proxy-types: fix clang-tidy bugprone-use-after-move error REVERT: 3673114bc9 proxy-types: fix clang-tidy bugprone-use-after-move error REVERT: 422923f384 proxy-types: fix clang-tidy bugprone-use-after-move error REVERT: c6784c6ade mpgen: disable clang-tidy misc-no-recursion error REVERT: c5498aa11b tidy: copy clang-tidy file from bitcoin core REVERT: 258a617c1e Merge bitcoin-core/libmultiprocess#160: refactor: EventLoop locking cleanups + client disconnect exception REVERT: 84cf56a0b5 test: Test disconnects during IPC calls REVERT: 949573da84 Prevent IPC server crash if disconnected during IPC call REVERT: 0198397580 Merge bitcoin-core/libmultiprocess#179: scripted-diff: Remove copyright year (ranges) REVERT: ea38392960 Prevent EventLoop async cleanup thread early exit during shutdown REVERT: 616d9a75d2 doc: Document ProxyClientBase destroy_connection option REVERT: 56fff76f94 Improve IPC client disconnected exceptions REVERT: 9b8ed3dc5f refactor: Add clang thread safety annotations to EventLoop REVERT: 52256e730f refactor: Remove DestructorCatcher and AsyncCallable REVERT: f24894794a refactor: Drop addClient/removeClient methods REVERT: 2b830e558e refactor: Use EventLoopRef instead of addClient/removeClient REVERT: 315ff537fb refactor: Add ProxyContext EventLoop* member REVERT: 9aaeec3678 proxy-io.h: Add EventLoopRef RAII class handle addClient/removeClient refcounting REVERT: f58c8d8ba2 proxy-io.h: Add more detailed EventLoop comment REVERT: 5108445e5d test: Add test coverage for client & server disconnections REVERT: 59030c68cb Merge bitcoin-core/libmultiprocess#181: type-function.h: Fix CustomBuildField overload REVERT: 688140b1df test: Add coverage for type-function.h REVERT: 8b96229da5 type-function.h: Fix CustomBuildField overload REVERT: fa2ff9a668 scripted-diff: Remove copyright year (ranges) REVERT: 27c7e8e5a5 Merge bitcoin-core/libmultiprocess#172: refactor: fix warnings from clang-tidy-20 and bitcoin-tidy REVERT: 2fe87d016b Merge bitcoin-core/libmultiprocess#173: doc: Fix error string typo REVERT: 57a65b8546 clang-tidy: Suppress bitcoin-nontrivial-threadlocal error REVERT: 0d8012f656 Merge bitcoin-core/libmultiprocess#165: clang-tidy: fix warnings introduced in version 19 REVERT: 3a96cdc18f clang-tidy: Fix bugprone-move-forwarding-reference error REVERT: c1e8c1a028 clang-tidy: Fix bugprone-move-forwarding-reference errors REVERT: aa19285303 use ranges transform REVERT: a78137ca73 make member function const REVERT: ca3226ec8a replace custom tuple unpacking code with `std::apply` REVERT: 949fe85fc9 replace SFINAE trick with `if constexpr` REVERT: 44ee4b40b8 doc: Fix error string typo REVERT: 35944ffd23 Merge bitcoin-core/libmultiprocess#168: Switch `MP_INCLUDE_DIR` to global property REVERT: a77c8e18eb Switch `MP_INCLUDE_DIR` to global property REVERT: f35df6bdc5 Merge bitcoin-core/libmultiprocess#166: doc: rename from chaincodelabs to bitcoin-core REVERT: 2e119973ce doc: rename from chaincodelabs to bitcoin-core REVERT: 1954f7f656 Merge bitcoin-core/libmultiprocess#164: Bump minimum required cmake to 3.12 REVERT: 729ff16d55 Bump minimum required cmake to 3.12 REVERT: 011fc53aea Merge bitcoin-core/libmultiprocess#161: cmake: Avoid including CTest if not top level project REVERT: 26b9f3dda4 Merge bitcoin-core/libmultiprocess#159: bugfix: Do not lock EventLoop::mutex after EventLoop is done REVERT: a7f0669320 cmake: Avoid including CTest if not top level project REVERT: 48d01bcca7 bugfix: Do not lock EventLoop::mutex after EventLoop is done REVERT: 408990787f Merge bitcoin-core/libmultiprocess#157: refactor: Avoid using std::format REVERT: eca8fd3eee refactor: Avoid using std::format REVERT: 9ba88dc2c7 Merge bitcoin-core/libmultiprocess#156: refactor: Remove locale-dependent function calls REVERT: 91193005a9 Merge bitcoin-core/libmultiprocess#155: scripted-diff: s/Libmultiprocess_EXTERNAL_MPGEN/MPGEN_EXECUTABLE/g REVERT: c8351c5f0b refactor: Remove locale-dependent function calls REVERT: 250c2ea54d scripted-diff: s/Libmultiprocess_EXTERNAL_MPGEN/MPGEN_EXECUTABLE/g REVERT: 9558ceb0d4 Merge bitcoin-core/libmultiprocess#152: refactor: Fix compiler and clang-tidy warnings REVERT: c6a61d8b9e Merge bitcoin-core/libmultiprocess#149: Avoid `-Wundef` compiler warnings REVERT: 0b8b7f92ca refactor: Fix `-Wsign-compare` compiler warning REVERT: a02c0794fd clang-tidy: Suppress `performance-enum-size` check warning REVERT: 593807ab5b clang-tidy: Fix `readability-container-size-empty` check REVERT: 68c1c6c51a clang-tidy: Fix `readability-avoid-return-with-void-value` check REVERT: 4abaa98429 clang-tidy: Fix `readability-avoid-nested-conditional-operator` check REVERT: 01ef094b4c clang-tidy: Fix `performance-unnecessary-value-param` check REVERT: c665a43f9c clang-tidy: Fix `misc-use-internal-linkage` check REVERT: 15c77e9722 clang-tidy: Fix `misc-include-cleaner` check REVERT: 848c902dd0 clang-tidy: Fix `misc-const-correctness` check REVERT: 4a2508c499 clang-tidy: Fix `modernize-type-traits` check REVERT: 8170d3d421 clang-tidy: Suppress `bugprone-empty-catch` check warning REVERT: c068596ac3 clang-tidy: Fix `bugprone-crtp-constructor-accessibility` check REVERT: 00036c0648 clang-tidy: Disable `performance-avoid-endl` check REVERT: 359a6157af clang-tidy: Disable `misc-use-anonymous-namespace` check REVERT: c978878a3c Merge bitcoin-core/libmultiprocess#145: CTest: Module must be included at the top level REVERT: 63ac092ddd CTest: Module must be included at the top level REVERT: d450fbf63e Avoid `-Wundef` compiler warnings REVERT: 477405eda3 Merge bitcoin-core/libmultiprocess#148: util: fix -Wpessimizing-move warning REVERT: 3bce9d03d1 util: fix -Wpessimizing-move warning REVERT: f09c50118f Merge bitcoin-core/libmultiprocess#147: cmake: EXTERNAL_MPGEN cleanups REVERT: 3d83c7aef1 Merge bitcoin-core/libmultiprocess#146: cmake: Suppress compiler warnings from capnproto headers REVERT: 21b92b69c9 cmake: EXTERNAL_MPGEN cleanups REVERT: 2fdd920b1e Merge bitcoin-core/libmultiprocess#143: cleanup: initialize vars in the EventLoop constructor in the correct order REVERT: 0c2ac4d772 Merge bitcoin-core/libmultiprocess#142: build: add option for external mpgen binary REVERT: f52d08c7f0 cleanup: initialize vars in the EventLoop constructor in the correct order REVERT: 75cf04a6ed build: add option for external mpgen binary REVERT: 72326b5d1e cmake: Simplify capnp include handling REVERT: 1e06ff07cd Merge bitcoin-core/libmultiprocess#140: build: don't clobber user/superproject c++ version REVERT: 65c7048251 cmake: Suppress compiler warnings from capnproto headers REVERT: df2153551e build: don't clobber user/superproject c++ version REVERT: 07c917f7ca Merge bitcoin-core/libmultiprocess#137: doc: Fix broken markdown links REVERT: e15816a6c3 doc: Fix broken markdown links REVERT: e89b2c6ac2 Merge bitcoin-core/libmultiprocess#136: cmake: Support being included with add_subdirectory REVERT: 3dea1d555a Merge bitcoin-core/libmultiprocess#135: refactor: proxy-types.h API cleanup REVERT: 6adbb1d6eb cmake: Support being included with add_subdirectory REVERT: 10bb7e4734 Merge bitcoin-core/libmultiprocess#94: c++ 20 cleanups REVERT: 7d59b8d14c move: add mp/type-data.h REVERT: 1103f86cd9 cmake: Define and use MP_INCLUDE_DIR variable REVERT: 798f4b5e35 moveonly: add mp/type-chrono.h REVERT: a595a0b228 moveonly: add mp/type-threadmap.h REVERT: e834ebd219 moveonly: add mp/type-decay.h REVERT: 5ee6cd4118 moveonly: add mp/type-exception.h REVERT: 394651237b moveonly: add mp/type-void.h REVERT: 8969d5a008 moveonly: add mp/type-message.h REVERT: 11b418f438 moveonly: add mp/type-struct.h REVERT: 5df55a3666 moveonly: add mp/type-function.h REVERT: 0d2f939214 moveonly: add mp/type-interface.h REVERT: 5417716ad8 moveonly: add mp/type-char.h REVERT: 83c444dc9d moveonly: add mp/type-string.h REVERT: df1375bd68 moveonly: add mp/type-number.h REVERT: 6d831ebb1d moveonly: add mp/type-tuple.h REVERT: c999100289 moveonly: add mp/type-pair.h REVERT: 079277f2ba moveonly: add mp/type-map.h REVERT: 6a68472bb3 moveonly: add mp/type-set.h REVERT: c6246c9198 moveonly: add mp/type-vector.h REVERT: 619d2c7405 moveonly: add mp/type-pointer.h REVERT: 3cb9d9fd5b moveonly: add mp/type-optional.h REVERT: b32e2b096c moveonly: add mp/type-context.h REVERT: f18a1ccd20 refactor: Rename ReadDestValue to ReadDestUpdate REVERT: 3dc1d42a7a Merge bitcoin-core/libmultiprocess#133: Fix debian "libatomic not found" error in downstream builds REVERT: eb27f5918f Merge bitcoin-core/libmultiprocess#131: doc: fix startAsyncThread comment REVERT: caf01fa469 Merge bitcoin-core/libmultiprocess#130: refactor: Add CleanupRun function to dedup clean list code REVERT: 72f6669b50 Merge bitcoin-core/libmultiprocess#129: Fix "disconnected: write(m_post_fd, &buffer, 1): Broken pipe" EventLoop shutdown races. REVERT: 67afc23069 Fix debian "libatomic not found" error in downstream builds REVERT: 0e4f88d3f9 Fix "disconnected: write(m_post_fd, &buffer, 1): Broken pipe" EventLoop shutdown races. REVERT: 063ff18210 fix startAsyncThread comment REVERT: 3b2617b3e5 Merge bitcoin-core/libmultiprocess#127: ProxyClientBase: avoid static_cast to partially destructed object REVERT: 63a39d4c9b ProxyClientBase: avoid static_cast to partially destructed object REVERT: 700085f9a8 refactor: Add CleanupRun function to dedup clean list code REVERT: 621a04a70f Merge bitcoin-core/libmultiprocess#120: proxy-types.h: add static_assert to detect int/enum size mismatch REVERT: 110349f626 test: Add coverage for enum/int conversions REVERT: 350067f431 Merge bitcoin-core/libmultiprocess#121: ProxyClientBase: avoid static_cast to partially constructed object REVERT: 5b81192847 ProxyClientBase: avoid static_cast to partially constructed object REVERT: bbc80abc20 proxy-types.h: add static_assert to detect when an int fields is too small to hold an enum value REVERT: abe254b973 Merge bitcoin-core/libmultiprocess#119: cmake: avoid libatomic not found error on debian REVERT: 245581d3e3 Merge bitcoin-core/libmultiprocess#118: shutdown bugfix: Prevent segfault in server if connection is broken during long function call REVERT: 196e6fcdbc bugfix: prevent null pointer dereference in server if client disconnects during method call REVERT: 296c380a4b cmake: avoid libatomic not found error on debian REVERT: 9d11042772 bugfix: prevent double delete segfault in server if client disconnects during method call REVERT: 181837b391 Merge bitcoin-core/libmultiprocess#116: shutdown bugfix: destroy RPC system before running cleanup callbacks REVERT: 2350843a31 shutdown bugfix: destroy RPC system before running cleanup callbacks REVERT: a4ac4241e0 Merge bitcoin-core/libmultiprocess#113: Add missing include to util.h REVERT: 6929c40913 Add missing include to util.h REVERT: f5a4957d26 Merge bitcoin-core/libmultiprocess#111: doc: Add internal design section REVERT: 1fa2ca7cd8 doc: Add internal design section REVERT: 015e95f7eb Merge bitcoin-core/libmultiprocess#110: cmake: add target_capnp_sources headers target REVERT: 66e12f1fae cmake: add target_capnp_sources headers target REVERT: f67cae8909 Merge bitcoin-core/libmultiprocess#109: example: Add missing thread.join() call so example can exit cleanly REVERT: 70b2d8794f example: Add missing thread.join() call so example can exit cleanly REVERT: 8bb6eab71b Merge bitcoin-core/libmultiprocess#108: doc: Add comments for socket descriptor handling when forking REVERT: 17a2399fe1 Merge bitcoin-core/libmultiprocess#107: example: Remove manual client adding REVERT: b56bf218c7 doc: Add comments for socket descriptor handling when forking REVERT: 34998101a3 example: Remove manual client adding REVERT: c1b4ab4eb8 Merge bitcoin-core/libmultiprocess#106: Bugfix: Clean up ThreadContext pointers when Connection is destroyed REVERT: 8ba0d03b44 Bugfix: Clean up ThreadContext pointers when Connection is destroyed REVERT: a9e16da55e Merge bitcoin-core/libmultiprocess#105: types: Add Custom{Build,Read,Pass}Message hooks REVERT: ca2cfedd2b types: Add Custom{Build,Read,Pass}Message hooks REVERT: 6aca5f389b Merge bitcoin-core/libmultiprocess#104: Fix $Proxy.wrap mapping for empty structs with no fields REVERT: e4540729c9 Merge bitcoin-core/libmultiprocess#103: cmake: Fix package configuration file REVERT: 90f8b37a3b Fix $Proxy.wrap mapping for empty structs with no fields REVERT: c373a94d5b cmake: Fix package configuration file REVERT: 8b8a4766ce Merge bitcoin-core/libmultiprocess#102: doc: Document shutdown sequences better REVERT: 2c66dd5995 doc: Document shutdown sequences better REVERT: 6cbe56ef3b refactor, moveonly: order lambda move captures first REVERT: 8da0524628 Merge bitcoin-core/libmultiprocess#101: connection: run async cleanups in LIFO not FIFO order REVERT: 1f76880dbf util: Get rid of unused Discard struct REVERT: c92e90ce08 proxy-types Drop JoinPromises function REVERT: 53ee9faf84 Merge bitcoin-core/libmultiprocess#100: doc: Add various code comments and documentation REVERT: e45c482c40 Merge bitcoin-core/libmultiprocess#99: proxy-types: Fix missing space in server destroy log print REVERT: 6825523c6e connection: run async cleanups in LIFO not FIFO order REVERT: 537c645652 doc: Improve ProxyServerCustom class documentation REVERT: 0c70a0f89e proxy-types: Fix missing space in server destroy log print REVERT: e29f74e8ff Merge bitcoin-core/libmultiprocess#98: cmake: Combine installed packages REVERT: d4d9f93175 doc: Document FunctionTraits/ProxyMethodTraits classes REVERT: 78c7dd0be5 doc: Document ProxyClient construct/destroy methods REVERT: e99c0b7564 doc: Document clientInvoke/serverInvoke functions REVERT: 2098ae1b18 doc: Add comment on serverInvoke ReplaceVoid usage REVERT: a1dfb0bab4 doc: Add comments to mp.Context PassField function on updating g_thread_context REVERT: e49a925a40 doc: Add comments to mp.Context PassField function on mp.Context.thread lookup REVERT: dc9b4e6a99 cmake: Combine installed packages REVERT: 2ed1e9aedb cmake: CMakeLists.txt cleanup REVERT: 3f8483b61a Merge bitcoin-core/libmultiprocess#97: cmake: rename new packages and module introduced in #95 and #96 REVERT: c6a1d7fb6b cmake: rename new packages and module introduced in #95 and #96 REVERT: 003eb04d6d Merge bitcoin-core/libmultiprocess#96: cmake: Introduce packages REVERT: 19dea85cf2 Merge bitcoin-core/libmultiprocess#95: cmake: Introduce `LibmultiprocessMacros` module REVERT: 4e70ad4719 cmake, refactor: Rename target export files REVERT: 694b6b13e9 cmake: Configure `LibmultiprocessGen` package REVERT: 3b20e35ab8 cmake: Configure `Libmultiprocess` package REVERT: 66643d8eaa cmake, refactor: Use `target_capnp_sources` for examples REVERT: bd2dfe27b0 cmake, refactor: Use `target_capnp_sources` for `mptest` target REVERT: d9ec22f81b cmake: Add `LibmultiprocessMacros` module REVERT: 8da797c5f1 Merge bitcoin-core/libmultiprocess#93: Fix support for vector<bool> serialization with libc++ REVERT: 10fc3eda9c Fix support for vector<bool> serialization with libc++ REVERT: 7d1fee06d6 Merge bitcoin-core/libmultiprocess#91: util: Drop Bind, BindTuple, ComposeFn, GetFn, and ThrowFn helpers REVERT: 65260d1851 util: Drop Bind, BindTuple, ComposeFn, GetFn, and ThrowFn helpers REVERT: 2cbbd09d8b Merge bitcoin-core/libmultiprocess#90: pkgconfig: Use @CMAKE_INSTALL_LIBDIR@ variable REVERT: 02711958d9 Merge bitcoin-core/libmultiprocess#89: pkgconfig: Drop -std=c++17 compile flag REVERT: 0f9605b026 pkgconfig: Use @CMAKE_INSTALL_LIBDIR@ variable REVERT: 590d1e737c pkgconfig: Drop -std=c++17 compile flag REVERT: 414542f81e Merge bitcoin-core/libmultiprocess#88: Fix current deprecation warnings as of capnproto-1.0.1 REVERT: 962e681356 mpgen: Avoid deprecated SchemaParser::parseDiskFile call REVERT: e8e89dfd37 Remove deprecated kj::mvCapture calls to avoid warnings REVERT: 61d5a0e661 Merge bitcoin-core/libmultiprocess#86: Add support for vector<bool> serialization REVERT: 1c6fb04ddd Add support for vector<bool> serialization REVERT: aea56f0e2a Merge bitcoin-core/libmultiprocess#85: Remove naming requirement for std::pair/std::tuple REVERT: 3df497456b Remove naming requirement for std::pair/std::tuple REVERT: fc28a48f01 Merge #83: Introduce `clang-tidy` and optimize code REVERT: 594466ae97 clang-tidy: Fix `readability-make-member-function-const` check REVERT: 037fec47c8 clang-tidy: Fix `performance-unnecessary-value-param` check REVERT: 463bead1f3 clang-tidy: Fix `performance-inefficient-vector-operation` check REVERT: a435b24e64 clang-tidy: Fix `performance-faster-string-find` check REVERT: ae416f903f clang-tidy: Fix `modernize-use-nullptr` check REVERT: 9f86c9a0a8 clang-tidy: Fix `modernize-use-equals-default` check REVERT: 18b52c1663 clang-tidy: Fix `modernize-use-emplace` check REVERT: 1a33c35a3b clang-tidy: Fix `modernize-return-braced-init-list` check REVERT: 8dd83bbd91 clang-tidy: Suppress `bugprone-suspicious-semicolon` check warning REVERT: 5e787bfbd0 Add option to run `clang-tidy` with compiler REVERT: 74e25d2cd4 Merge #84: Avoid passing some function arguments by value REVERT: 8ef94d2e86 Avoid passing some function arguments by value REVERT: 917877afa8 Merge #79: Install Exports for custom `install-{lib,bin}` targets REVERT: 2dda7536b5 Install Exports for custom `install-{lib,bin}` targets REVERT: 54bd57fb3b Use `GNUInstallDirs` module REVERT: 1af83d1523 Merge #81: Add ReadDestTemp function to make it easier to call ReadField with less boilerplate REVERT: e66e6e82f6 Merge #82: build: Fix missing Cap'n Proto include directories REVERT: c75362392f build: Fix missing Cap'n Proto include directories REVERT: 70d108bc60 Add ReadDestTemp function to make it easier to call ReadField with less boilerplate REVERT: 7441069261 Merge #80: doc: Fix mpgen usage string REVERT: fcad5fbe53 doc: Fix mpgen usage string REVERT: ddd2cee627 Merge #78: refactor: Do not shadow `InvokeContext::connection` member REVERT: f999694daa refactor: Do not shadow `InvokeContext::connection` member REVERT: 4992b52754 Merge #74: Add `install-lib` and `install-bin` build targets REVERT: fa130db398 Add `install-bin` target REVERT: c4d26d2ddb Add `install-lib` target REVERT: bc3d166d37 Install `proxy.capnp` with `mpgen` target REVERT: f85fefff28 Merge #73: Drop unneeded include directory REVERT: 80dc922e4c Merge #72: Make `mpgen` target independent from `multiprocess` one REVERT: d321ef89e7 Merge #71: Use defined `CXX_STANDARD` for environment introspection REVERT: 331b5a6e49 Merge #70: Fix check for `pthread_threadid_np` REVERT: d36ebb9ace Drop unneeded include directory REVERT: 665d1fdc67 Make `mpgen` target independent from `multiprocess` one REVERT: 2eff5da83c Use defined `CXX_STANDARD` for environment introspection REVERT: 373d0d7823 Fix check for `pthread_threadid_np` REVERT: c6849de823 Merge #69: Fix CMake minimum required version REVERT: 6902bfd40e Fix CMake minimum required version REVERT: 49dc279926 Merge bitcoin-core/libmultiprocess#66: Fix typos REVERT: 9f4dac644a Fix typos REVERT: 7d10f3b1e3 Merge bitcoin-core/libmultiprocess#65: Fix clang "unknown warning group" errors REVERT: 680776fcc8 Fix clang "unknown warning group" errors REVERT: bc6624a5d3 Merge bitcoin-core/libmultiprocess#64: cleanup: Remove AUTORET macro and clean up PassField overrides REVERT: d2a9db9ebf Merge bitcoin-core/libmultiprocess#63: Fix mptest link error caused by missing kj-async dependency REVERT: cf7ebfe68d Replace ThreadMap Passfield override with generic count(0) override REVERT: 3f388cf064 Inline last AUTO_RETURN uses and remove macro REVERT: 41db49c7bc Consolidate PassField function to remove AUTO_RETURN uses REVERT: 1d005053b0 Replace output.init AUTO_RETURN uses with decltype(auto) REVERT: ea1a77b98b Replace AUTO_RETURN uses with decltype(auto) REVERT: 029d84fe77 Fix mptest link error caused by missing kj-async dependency REVERT: 306c8b100d Merge bitcoin-core/libmultiprocess#62: Fix clang compiler warnings REVERT: 1b638d67de Avoid delete-non-abstract-non-virtual-dtor warnings for mp::ProxyCallbackImpl REVERT: 5738b8ae09 Avoid delete-non-abstract-non-virtual-dtor warnings REVERT: 921e23e8d1 Disable clang suggest-override warnings for proxy clients REVERT: 34ce921d2d Merge bitcoin-core/libmultiprocess#58: Fix std::move compiler warning REVERT: 49004c8726 Merge bitcoin-core/libmultiprocess#57: doc/install.md: add cmake to brew install command REVERT: e386cfad52 Fix std::move compiler warning REVERT: 424d635ab1 doc/install.md: add cmake to brew install command REVERT: 8abd3daf1c Merge #55: Add doc/ folder, split up readme and add more usage documentation REVERT: 1a3dc8d263 Add documentation about interface definitions REVERT: 5539208883 Split up README.md REVERT: 805eb73e57 Merge #49: Add standalone example with 3 processes REVERT: 4b45e14aad Add standalone example with 3 processes REVERT: 17bfda9ece Merge #48: Move test/src/ files one level up REVERT: b648f2a13d Merge #47: gen.cpp: Check local includes before install includes REVERT: 8b5259c5b4 Move test/src/ files one level up REVERT: c2f866fa8d Merge #45: Comments and LogEscape REVERT: 1007bd7c2b gen.cpp: Check local includes before install includes REVERT: 22afe27d1e util: fix LogEscape bug REVERT: 89ababdd3c doc: add note on vats REVERT: 6e36f0f53c doc: fix various typos REVERT: b6e060af7b README: add kj explainer REVERT: d576d975de Merge #43: Drop hardcoded #include lines in generated files REVERT: 35d2091134 Merge #42: Support attaching custom cleanup functions to proxy client and server classes REVERT: 2ccc479f86 Drop hardcoded #include lines in generated files REVERT: ce8e8b654a Add ProxyTypeRegister typeid map REVERT: fbdaaa75aa Add cleanup callbacks to ProxyContext REVERT: 34e9b78ec1 refactor: Move connection field to ProxyContext struct REVERT: 39ad0f5eae Generate ProxyType traits for interface types REVERT: 1b4012cadd Merge #41: Avoid depending on argument default constructors REVERT: 0e97be35f9 Avoid depending on argument default constructors REVERT: 4dcd80741e Merge #40: Disable GCC suggest-override warnings for proxy clients REVERT: 05f9817c36 Disable GCC suggest-override warnings for proxy clients REVERT: 4c59977392 Merge #38: Add "extends" inherited method support REVERT: de748be4cf Add "extends" inherited method support REVERT: 9f5b835564 Merge #37: Add "make check" target to build and run tests REVERT: 037835320b Add "make check" target to build and run tests REVERT: 9d23fdd030 Merge #35: Fix README.md markdown REVERT: 4d946aa6d2 Fix README.md markdown REVERT: 5741d750a0 Merge #34: Add shared_ptr callback support REVERT: 9ce0335b26 Add comment saying how to fix clientInvoke missing Proxy.Context assert REVERT: 31b4f1be84 Add shared_ptr ownership and lifetime support REVERT: 27f8a35ec0 Add saveCallback / callbackSaved test setup REVERT: 5390a1b116 Add support for passing shared_ptrs without extending lifetime REVERT: 39bbf74a08 Add CustomReadField priority param for more flexibility and consistency with CustomBuildField REVERT: da489bef3f Fix bugs in PassField overload for callback objects passed by reference REVERT: ab4568bbbd Add test coverage for thread map and callbacks REVERT: 1d630f536d Merge #33: Fix empty exception values from bad ThrowFn declaration REVERT: c3efcae099 Fix empty exception values from bad ThrowFn declaration REVERT: 78f2f75d47 Merge #31: Unify ReadFieldNew / ReadFieldUpdate REVERT: 112f364f01 Unify ReadFieldNew / ReadFieldUpdate REVERT: c0e3a50455 Merge #25: Obliterate Boost REVERT: 10b5c69dbc Obliterate Boost REVERT: f4112b7966 Switch from C++14 to C++17 REVERT: f2ea4b91b4 Merge #30: proxy-io.h: fix missing assert.h include REVERT: e2ad13aee2 Merge #29: Update make test command in readme REVERT: fad36ab1a1 proxy-io.h: fix missing assert.h include REVERT: 4d7864560e Merge #28: CMake workarounds for ubuntu capnproto 0.6.1 compatibility REVERT: c8923eb01b Update make test command in readme REVERT: 097bce268a Merge #24: Don't print a dash if thread name is not known REVERT: a440eda4c8 Merge #23: Tell std::system_error() which function failed REVERT: b09973bf7a CMake workarounds for ubuntu capnproto 0.6.1 compatibility REVERT: 570db83ef4 Don't print a dash if thread name is not known REVERT: d6dac63584 Tell std::system_error() which function failed REVERT: 49a9637237 Merge #22: Handle fork(2) failures REVERT: 50b6a7f8c2 Merge #21: Refactor ThreadName() to improve its portability REVERT: 16ebae8225 Handle fork(2) failures REVERT: f1857e3e91 Refactor ThreadName() to improve its portability REVERT: fe76b287f7 Merge #19: Fix compilation of foo.h: include <string> REVERT: 829741ce5f Merge #18: A followup to a616312: remove unnecessary call REVERT: c92112a786 Fix compilation of foo.h: include <string> REVERT: 3b5da8fb44 A followup to a616312: remove unnecessary call REVERT: d3388da2c0 Merge #17: Avoid using boost::optional in PassField() REVERT: a616312ed8 Avoid using boost::optional in PassField() REVERT: abb3ae9ce9 Merge #16: Reduce boost usage REVERT: fb73b81b98 Change EventLoop::m_task_set to not use boost REVERT: 138ad6794a Change Field::(param and result) to not use boost REVERT: 5724a2c58a Remove boost usage from GetAnnotation() REVERT: cab9c51669 Remove unnecessary boost include REVERT: e0319f428a Merge #15: Add ListenConnections function REVERT: d519e18859 Add ListenConnections function REVERT: d24cae648a Merge #14: Add simpler ServeStream function REVERT: 710238c551 Add simpler ServeStream function REVERT: 5f425473be Merge #13: Add mpgen.mk makefile rules REVERT: b72ec472bb Add mpgen.mk makefile rules REVERT: 86d5a45b8d Merge #12: Add Eventloop void* context pointer REVERT: 2a2549cea3 Merge #11: Replace ProxyServer connection pointer with reference REVERT: 4907c5dced Add Eventloop void* context pointer REVERT: e7687dbed6 Replace ProxyServer connection pointer with reference REVERT: bd8ee26336 Merge #10: Remove #include <syscall.h> to avoid mac os build error REVERT: 4e452e9c1c Remove #include <syscall.h> to avoid mac os build error REVERT: 9cd1a5a9c1 Merge #9: Invoke capnp compile from mpgen REVERT: f89e4b32dc Invoke capnp compile from mpgen REVERT: dee0711538 Merge #8: Add Connnect/Serve/Spawn/Wait functions REVERT: 8125688f6c Merge #7: Add ProxyClientBase destroy_connection option REVERT: f324c66615 Add Connnect/Serve/Spawn/Wait functions REVERT: da73a6765f Merge #6: Explicitly request C++14 compiler REVERT: c685fa9bed Add ProxyClientBase destroy_connection option REVERT: 409fe97492 Explicitly request C++14 compiler REVERT: 45785e7f19 Merge #3: Limit LogEscape string size REVERT: 99bc4c523d Merge #2: Set mpgen rpath REVERT: 724d2f7fe3 Limit LogEscape string size REVERT: 4dcf39ffda Set mpgen rpath REVERT: cf5afd6dd9 Merge #1: Fix libmultiprocess.pc install path REVERT: 1bc076fbb9 Fix libmultiprocess.pc install path REVERT: 06e1045bab libmultiprocess initial commit git-subtree-dir: src/ipc/libmultiprocess git-subtree-split: 27ada4080964d26fed43d1c7329ba54b4c86199f
Fix issue where if a client disconnects in the middle of a long running IPC method call, the server will segfault when the method eventually returns.
This issue was reported tdb3 in bitcoin/bitcoin#31003 (review) with a stack trace showing where the crash happens in the
PassFieldmp.Contextoverload while callingrequest_threads.erase.