Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] Fix more thread issues #2925

Merged
merged 4 commits into from
Apr 25, 2024

Conversation

panleone
Copy link

@panleone panleone commented Apr 8, 2024

This PR fixes more thread issues that ThreadSanitizer showed:

first commit:
Solve a possible 3-threads deadlock fixed by locking mempool.cs before cs_inventory (see the comment for the log)

second commit:
solve the trivial data race where nodeState is accessed without locking the corresponding mutex

third commit:
solve all the issues that the function getQuorumNodes had:

  • it iterator was accessed without having the lock on cs_vPendingMasternodes which was causing a possible data race
  • connman->vNodes was accessed without locking the mutex cs_vNodes (another possible data race)

Solved by using the function connman->ForEachNode and removing the useless getter.

fourth commit:
Solve a possible deadlock: lock cs_vPendingMasternodes before calling connmann->ForEachNode(...)

@panleone
Copy link
Author

panleone commented Apr 8, 2024

log of the possible deadlock solved with the first commit:

WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=12731)
  Cycle in lock order graph: M133129 (0x7f336defd3b0) => M133183 (0x7b6c000100b0) => M132850 (0x559280f5c200) => M133129

  Mutex M133183 acquired here while holding mutex M133129 in thread T20:
    #0 pthread_mutex_lock ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4324 (libtsan.so.2+0x558e1)
    #1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/12/bits/gthr-default.h:749 (pivxd+0x8617d)
    #2 __gthread_recursive_mutex_lock /usr/include/x86_64-linux-gnu/c++/12/bits/gthr-default.h:811 (pivxd+0x8617d)
    #3 std::recursive_mutex::lock() /usr/include/c++/12/mutex:108 (pivxd+0x8617d)
    #4 std::unique_lock<std::recursive_mutex>::lock() /usr/include/c++/12/bits/unique_lock.h:139 (pivxd+0x90459)
    #5 UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::Enter(char const*, char const*, int) sync.h:133 (pivxd+0x90504)
    #6 UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::UniqueLock(AnnotatedMixin<std::recursive_mutex>&, char const*, char const*, int, bool) sync.h:154 (pivxd+0x905b4)
    #7 CNode::PushInventory(CInv const&) <null> (pivxd+0xeea5e)
    #8 CConnman::RelayInv(CInv&) /home/ale/PIVX/src/net.cpp:2523 (pivxd+0xfd6d6)
    #9 CSporkMessage::Relay() /home/ale/PIVX/src/spork.cpp:326 (pivxd+0x699871)
    #10 CSporkManager::UpdateSpork(SporkId, long) /home/ale/PIVX/src/spork.cpp:198 (pivxd+0x69d563)
    #11 spork(JSONRPCRequest const&) rpc/misc.cpp:311 (pivxd+0x1c39c2)
    #12 CRPCTable::execute(JSONRPCRequest const&) const rpc/server.cpp:513 (pivxd+0x20a4f9)
    #13 HTTPReq_JSONRPC /home/ale/PIVX/src/httprpc.cpp:183 (pivxd+0x428d5c)
    #14 bool std::__invoke_impl<bool, bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__invoke_other, bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) /usr/include/c++/12/bits/invoke.h:61 (pivxd+0x182c43)
    #15 std::enable_if<std::__and_<std::is_void<void>, std::__is_invocable<bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> >::value, void>::type std::__invoke_r<void, bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) /usr/include/c++/12/bits/invoke.h:154 (pivxd+0x182c43)
    #16 std::_Function_handler<void (HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), bool (*)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>::_M_invoke(std::_Any_data const&, HTTPRequest*&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) /usr/include/c++/12/bits/std_function.h:290 (pivxd+0x182c43)
    #17 std::function<void (HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>::operator()(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const /usr/include/c++/12/bits/std_function.h:591 (pivxd+0x42eb79)
    #18 HTTPWorkItem::operator()() /home/ale/PIVX/src/httpserver.cpp:54 (pivxd+0x42ebf1)
    #19 WorkQueue<HTTPClosure>::Run() /home/ale/PIVX/src/httpserver.cpp:118 (pivxd+0x42f94a)
    #20 HTTPWorkQueueRun /home/ale/PIVX/src/httpserver.cpp:340 (pivxd+0x42b4c4)
    #21 void std::__invoke_impl<void, void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*>(std::__invoke_other, void (*&&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&&) /usr/include/c++/12/bits/invoke.h:61 (pivxd+0x42e6d8)
    #22 std::__invoke_result<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*>::type std::__invoke<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*>(void (*&&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&&) /usr/include/c++/12/bits/invoke.h:96 (pivxd+0x42e6d8)
    #23 void std::thread::_Invoker<std::tuple<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*> >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) /usr/include/c++/12/bits/std_thread.h:252 (pivxd+0x42e6d8)
    #24 std::thread::_Invoker<std::tuple<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*> >::operator()() /usr/include/c++/12/bits/std_thread.h:259 (pivxd+0x42e6d8)
    #25 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*> > >::_M_run() /usr/include/c++/12/bits/std_thread.h:210 (pivxd+0x42e6d8)
    #26 <null> <null> (libstdc++.so.6+0xd44a2)

    Hint: use TSAN_OPTIONS=second_deadlock_stack=1 to get more informative warning message

  Mutex M132850 acquired here while holding mutex M133183 in thread T35:
    #0 pthread_mutex_lock ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4324 (libtsan.so.2+0x558e1)
    #1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/12/bits/gthr-default.h:749 (pivxd+0x8617d)
    #2 __gthread_recursive_mutex_lock /usr/include/x86_64-linux-gnu/c++/12/bits/gthr-default.h:811 (pivxd+0x8617d)
    #3 std::recursive_mutex::lock() /usr/include/c++/12/mutex:108 (pivxd+0x8617d)
    #4 std::unique_lock<std::recursive_mutex>::lock() /usr/include/c++/12/bits/unique_lock.h:139 (pivxd+0x90459)
    #5 UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::Enter(char const*, char const*, int) sync.h:133 (pivxd+0x90504)
    #6 UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::UniqueLock(AnnotatedMixin<std::recursive_mutex>&, char const*, char const*, int, bool) sync.h:154 (pivxd+0x905b4)
    #7 CTxMemPool::CompareDepthAndScore(uint256 const&, uint256 const&) /home/ale/PIVX/src/txmempool.cpp:1045 (pivxd+0x24dd1b)
    #8 CompareInvMempoolOrder::operator()(std::_Rb_tree_const_iterator<uint256>, std::_Rb_tree_const_iterator<uint256>) /home/ale/PIVX/src/net_processing.cpp:2376 (pivxd+0x158a2f)
    #9 bool __gnu_cxx::__ops::_Iter_comp_val<CompareInvMempoolOrder>::operator()<__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, std::_Rb_tree_const_iterator<uint256> >(__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, std::_Rb_tree_const_iterator<uint256>&) /usr/include/c++/12/bits/predefined_ops.h:196 (pivxd+0x158a2f)
    #10 void std::__push_heap<__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, long, std::_Rb_tree_const_iterator<uint256>, __gnu_cxx::__ops::_Iter_comp_val<CompareInvMempoolOrder> >(__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, long, long, std::_Rb_tree_const_iterator<uint256>, __gnu_cxx::__ops::_Iter_comp_val<CompareInvMempoolOrder>&) /usr/include/c++/12/bits/stl_heap.h:140 (pivxd+0x158b18)
    #11 void std::__adjust_heap<__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, long, std::_Rb_tree_const_iterator<uint256>, __gnu_cxx::__ops::_Iter_comp_iter<CompareInvMempoolOrder> >(__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, long, long, std::_Rb_tree_const_iterator<uint256>, __gnu_cxx::__ops::_Iter_comp_iter<CompareInvMempoolOrder>) /usr/include/c++/12/bits/stl_heap.h:247 (pivxd+0x158c9f)
    #12 void std::__make_heap<__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, __gnu_cxx::__ops::_Iter_comp_iter<CompareInvMempoolOrder> >(__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, __gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, __gnu_cxx::__ops::_Iter_comp_iter<CompareInvMempoolOrder>&) /usr/include/c++/12/bits/stl_heap.h:356 (pivxd+0x158dcc)
    #13 void std::make_heap<__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, CompareInvMempoolOrder>(__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, __gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<uint256>*, std::vector<std::_Rb_tree_const_iterator<uint256>, std::allocator<std::_Rb_tree_const_iterator<uint256> > > >, CompareInvMempoolOrder) /usr/include/c++/12/bits/stl_heap.h:413 (pivxd+0x158e4f)
    #14 PeerLogicValidation::SendMessages(CNode*, std::atomic<bool>&) /home/ale/PIVX/src/net_processing.cpp:2568 (pivxd+0x13b210)
    #15 CConnman::ThreadMessageHandler() /home/ale/PIVX/src/net.cpp:1981 (pivxd+0xf9631)
    #16 void std::__invoke_impl<void, void (CConnman::*&)(), CConnman*&>(std::__invoke_memfun_deref, void (CConnman::*&)(), CConnman*&) /usr/include/c++/12/bits/invoke.h:74 (pivxd+0x121cf7)
    #17 std::__invoke_result<void (CConnman::*&)(), CConnman*&>::type std::__invoke<void (CConnman::*&)(), CConnman*&>(void (CConnman::*&)(), CConnman*&) /usr/include/c++/12/bits/invoke.h:96 (pivxd+0x121d59)
    #18 void std::_Bind<void (CConnman::*(CConnman*))()>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/include/c++/12/functional:484 (pivxd+0x121d59)
    #19 void std::_Bind<void (CConnman::*(CConnman*))()>::operator()<, void>() /usr/include/c++/12/functional:567 (pivxd+0x121d59)
    #20 void std::__invoke_impl<void, std::_Bind<void (CConnman::*(CConnman*))()>&>(std::__invoke_other, std::_Bind<void (CConnman::*(CConnman*))()>&) /usr/include/c++/12/bits/invoke.h:61 (pivxd+0x121dbb)
    #21 std::enable_if<std::__and_<std::is_void<void>, std::__is_invocable<std::_Bind<void (CConnman::*(CConnman*))()>&> >::value, void>::type std::__invoke_r<void, std::_Bind<void (CConnman::*(CConnman*))()>&>(std::_Bind<void (CConnman::*(CConnman*))()>&) /usr/include/c++/12/bits/invoke.h:154 (pivxd+0x121dbb)
    #22 std::_Function_handler<void (), std::_Bind<void (CConnman::*(CConnman*))()> >::_M_invoke(std::_Any_data const&) /usr/include/c++/12/bits/std_function.h:290 (pivxd+0x121dbb)
    #23 std::function<void ()>::operator()() const /usr/include/c++/12/bits/std_function.h:591 (pivxd+0x8fad4)
    #24 void TraceThread<std::function<void ()> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>) util/system.h:276 (pivxd+0x923ab)
    #25 void std::__invoke_impl<void, void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>), char const*, std::function<void ()> >(std::__invoke_other, void (*&&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>), char const*&&, std::function<void ()>&&) /usr/include/c++/12/bits/invoke.h:61 (pivxd+0x12d51f)
    #26 std::__invoke_result<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>), char const*, std::function<void ()> >::type std::__invoke<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>), char const*, std::function<void ()> >(void (*&&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>), char const*&&, std::function<void ()>&&) /usr/include/c++/12/bits/invoke.h:96 (pivxd+0x12d5b1)
    #27 void std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>), char const*, std::function<void ()> > >::_M_invoke<0ul, 1ul, 2ul>(std::_Index_tuple<0ul, 1ul, 2ul>) /usr/include/c++/12/bits/std_thread.h:252 (pivxd+0x12d5b1)
    #28 std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>), char const*, std::function<void ()> > >::operator()() /usr/include/c++/12/bits/std_thread.h:259 (pivxd+0x12d60c)
    #29 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>), char const*, std::function<void ()> > > >::_M_run() /usr/include/c++/12/bits/std_thread.h:210 (pivxd+0x12d60c)
    #30 <null> <null> (libstdc++.so.6+0xd44a2)

  Mutex M133129 acquired here while holding mutex M132850 in thread T21:
    #0 pthread_mutex_lock ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4324 (libtsan.so.2+0x558e1)
    #1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/12/bits/gthr-default.h:749 (pivxd+0x8617d)
    #2 __gthread_recursive_mutex_lock /usr/include/x86_64-linux-gnu/c++/12/bits/gthr-default.h:811 (pivxd+0x8617d)
    #3 std::recursive_mutex::lock() /usr/include/c++/12/mutex:108 (pivxd+0x8617d)
    #4 std::unique_lock<std::recursive_mutex>::lock() /usr/include/c++/12/bits/unique_lock.h:139 (pivxd+0x90459)
    #5 UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::Enter(char const*, char const*, int) sync.h:133 (pivxd+0x90504)
    #6 UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::UniqueLock(AnnotatedMixin<std::recursive_mutex>&, char const*, char const*, int, bool) sync.h:154 (pivxd+0x905b4)
    #7 ForEachNode<CMNAuth::NotifyMasternodeListChanged(bool, const CDeterministicMNList&, const CDeterministicMNListDiff&)::<lambda(CNode*)> > net.h:244 (pivxd+0x37d08c)
    #8 CMNAuth::NotifyMasternodeListChanged(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&) evo/mnauth.cpp:205 (pivxd+0x37d1bd)
    #9 EvoNotificationInterface::NotifyMasternodeListChanged(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&) evo/evonotificationinterface.cpp:35 (pivxd+0x37ab4d)
    #10 void std::__invoke_impl<void, void (CValidationInterface::*&)(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), CValidationInterface*&, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>(std::__invoke_memfun_deref, void (CValidationInterface::*&)(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), CValidationInterface*&, bool&&, CDeterministicMNList const&, CDeterministicMNListDiff const&) /usr/include/c++/12/bits/invoke.h:74 (pivxd+0x2ef31f)
    #11 std::__invoke_result<void (CValidationInterface::*&)(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), CValidationInterface*&, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>::type std::__invoke<void (CValidationInterface::*&)(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), CValidationInterface*&, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>(void (CValidationInterface::*&)(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), CValidationInterface*&, bool&&, CDeterministicMNList const&, CDeterministicMNListDiff const&) /usr/include/c++/12/bits/invoke.h:96 (pivxd+0x2ef3ba)
    #12 void std::_Bind<void (CValidationInterface::*(CValidationInterface*, std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>))(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>::__call<void, bool&&, CDeterministicMNList const&, CDeterministicMNListDiff const&, 0ul, 1ul, 2ul, 3ul>(std::tuple<bool&&, CDeterministicMNList const&, CDeterministicMNListDiff const&>&&, std::_Index_tuple<0ul, 1ul, 2ul, 3ul>) /usr/include/c++/12/functional:484 (pivxd+0x2ef3ba)
    #13 void std::_Bind<void (CValidationInterface::*(CValidationInterface*, std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>))(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>::operator()<bool, CDeterministicMNList const&, CDeterministicMNListDiff const&, void>(bool&&, CDeterministicMNList const&, CDeterministicMNListDiff const&) /usr/include/c++/12/functional:567 (pivxd+0x2ef459)
    #14 boost::detail::function::void_function_obj_invoker3<std::_Bind<void (CValidationInterface::*(CValidationInterface*, std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>))(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>, void, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>::invoke(boost::detail::function::function_buffer&, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&) /usr/include/boost/function/function_template.hpp:158 (pivxd+0x2ef4d3)
    #15 boost::function3<void, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>::operator()(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&) const /usr/include/boost/function/function_template.hpp:763 (pivxd+0x304477)
    #16 boost::signals2::detail::void_type boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::m_invoke<boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>, 0u, 1u, 2u, bool&, CDeterministicMNList const&, CDeterministicMNListDiff const&>(boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>&, boost::signals2::detail::unsigned_meta_array<0u, 1u, 2u>, std::tuple<bool&, CDeterministicMNList const&, CDeterministicMNListDiff const&> const&, boost::enable_if<boost::is_void<boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>::result_type>, void>::type*) const /usr/include/boost/signals2/detail/variadic_slot_invoker.hpp:105 (pivxd+0x30454f)
    #17 boost::signals2::detail::void_type boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::operator()<boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>, bool&, CDeterministicMNList const&, CDeterministicMNListDiff const&, 3ul>(boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>&, std::tuple<bool&, CDeterministicMNList const&, CDeterministicMNListDiff const&> const&, mpl_::size_t<3ul>) const /usr/include/boost/signals2/detail/variadic_slot_invoker.hpp:90 (pivxd+0x3045d2)
    #18 boost::signals2::detail::void_type boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>::operator()<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >(boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > const&) const /usr/include/boost/signals2/detail/variadic_slot_invoker.hpp:133 (pivxd+0x3045d2)
    #19 boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> >::dereference() const /usr/include/boost/signals2/detail/slot_call_iterator.hpp:110 (pivxd+0x30465c)
    #20 boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> >::reference boost::iterators::iterator_core_access::dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > const&) /usr/include/boost/iterator/iterator_facade.hpp:550 (pivxd+0x30e192)
    #21 boost::iterators::detail::iterator_facade_base<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> >, boost::signals2::detail::void_type, boost::iterators::single_pass_traversal_tag, boost::signals2::detail::void_type const&, long, false, false>::operator*() const /usr/include/boost/iterator/iterator_facade.hpp:656 (pivxd+0x30e192)
    #22 void boost::signals2::optional_last_value<void>::operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> >) const /usr/include/boost/signals2/optional_last_value.hpp:57 (pivxd+0x30e192)
    #23 void boost::signals2::detail::combiner_invoker<void>::operator()<boost::signals2::optional_last_value<void>, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >(boost::signals2::optional_last_value<void>&, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)> >, boost::signals2::mutex> >) const /usr/include/boost/signals2/detail/result_type_wrapper.hpp:64 (pivxd+0x30e583)
    #24 boost::signals2::detail::signal_impl<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>, boost::function<void (boost::signals2::connection const&, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>, boost::signals2::mutex>::operator()(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&) /usr/include/boost/signals2/detail/signal_template.hpp:243 (pivxd+0x30e583)
    #25 boost::signals2::signal<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>, boost::function<void (boost::signals2::connection const&, bool, CDeterministicMNList const&, CDeterministicMNListDiff const&)>, boost::signals2::mutex>::operator()(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&) /usr/include/boost/signals2/detail/signal_template.hpp:722 (pivxd+0x30e684)
    #26 CMainSignals::NotifyMasternodeListChanged(bool, CDeterministicMNList const&, CDeterministicMNListDiff const&) /home/ale/PIVX/src/validationinterface.cpp:232 (pivxd+0x2c8210)
    #27 CDeterministicMNManager::ProcessBlock(CBlock const&, CBlockIndex const*, CValidationState&, bool) evo/deterministicmns.cpp:516 (pivxd+0x350760)
    #28 ProcessSpecialTxsInBlock(CBlock const&, CBlockIndex const*, CCoinsViewCache const*, CValidationState&, bool) evo/specialtx_validation.cpp:554 (pivxd+0x38a0b3)
    #29 ConnectBlock /home/ale/PIVX/src/validation.cpp:1669 (pivxd+0x282533)
    #30 ConnectTip /home/ale/PIVX/src/validation.cpp:2058 (pivxd+0x288097)
    #31 ActivateBestChainStep /home/ale/PIVX/src/validation.cpp:2228 (pivxd+0x288e20)
    #32 ActivateBestChain(CValidationState&, std::shared_ptr<CBlock const>) /home/ale/PIVX/src/validation.cpp:2325 (pivxd+0x28928e)
    #33 ProcessNewBlock(std::shared_ptr<CBlock const> const&, FlatFilePos const*) /home/ale/PIVX/src/validation.cpp:3439 (pivxd+0x28b45f)
    #34 generateBlocks(Consensus::Params const&, CWallet*, bool, int, int, int, CScript*) rpc/mining.cpp:61 (pivxd+0x1c1808)
    #35 generate(JSONRPCRequest const&) rpc/mining.cpp:140 (pivxd+0x1c21ab)
    #36 CRPCTable::execute(JSONRPCRequest const&) const rpc/server.cpp:513 (pivxd+0x20a4f9)
    #37 HTTPReq_JSONRPC /home/ale/PIVX/src/httprpc.cpp:183 (pivxd+0x428d5c)
    #38 bool std::__invoke_impl<bool, bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__invoke_other, bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) /usr/include/c++/12/bits/invoke.h:61 (pivxd+0x182c43)
    #39 std::enable_if<std::__and_<std::is_void<void>, std::__is_invocable<bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&> >::value, void>::type std::__invoke_r<void, bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(bool (*&)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), HTTPRequest*&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) /usr/include/c++/12/bits/invoke.h:154 (pivxd+0x182c43)
    #40 std::_Function_handler<void (HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), bool (*)(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>::_M_invoke(std::_Any_data const&, HTTPRequest*&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) /usr/include/c++/12/bits/std_function.h:290 (pivxd+0x182c43)
    #41 std::function<void (HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>::operator()(HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const /usr/include/c++/12/bits/std_function.h:591 (pivxd+0x42eb79)
    #42 HTTPWorkItem::operator()() /home/ale/PIVX/src/httpserver.cpp:54 (pivxd+0x42ebf1)
    #43 WorkQueue<HTTPClosure>::Run() /home/ale/PIVX/src/httpserver.cpp:118 (pivxd+0x42f94a)
    #44 HTTPWorkQueueRun /home/ale/PIVX/src/httpserver.cpp:340 (pivxd+0x42b4c4)
    #45 void std::__invoke_impl<void, void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*>(std::__invoke_other, void (*&&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&&) /usr/include/c++/12/bits/invoke.h:61 (pivxd+0x42e6d8)
    #46 std::__invoke_result<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*>::type std::__invoke<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*>(void (*&&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&&) /usr/include/c++/12/bits/invoke.h:96 (pivxd+0x42e6d8)
    #47 void std::thread::_Invoker<std::tuple<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*> >::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) /usr/include/c++/12/bits/std_thread.h:252 (pivxd+0x42e6d8)
    #48 std::thread::_Invoker<std::tuple<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*> >::operator()() /usr/include/c++/12/bits/std_thread.h:259 (pivxd+0x42e6d8)
    #49 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*> > >::_M_run() /usr/include/c++/12/bits/std_thread.h:210 (pivxd+0x42e6d8)
    #50 <null> <null> (libstdc++.so.6+0xd44a2)

  Thread T20 'b-bitcoin-httpw' (tid=12898, running) created by main thread at:
    #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1001 (libtsan.so.2+0x5e686)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xd4578)
    #2 void std::__new_allocator<std::thread>::construct<std::thread, void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&>(std::thread*, void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&) /usr/include/c++/12/bits/new_allocator.h:175 (pivxd+0x432485)
    #3 void std::allocator_traits<std::allocator<std::thread> >::construct<std::thread, void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&>(std::allocator<std::thread>&, std::thread*, void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&) /usr/include/c++/12/bits/alloc_traits.h:516 (pivxd+0x432485)
    #4 void std::vector<std::thread, std::allocator<std::thread> >::_M_realloc_insert<void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&>(__gnu_cxx::__normal_iterator<std::thread*, std::vector<std::thread, std::allocator<std::thread> > >, void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&) /usr/include/c++/12/bits/vector.tcc:462 (pivxd+0x432485)
    #5 void std::vector<std::thread, std::allocator<std::thread> >::emplace_back<void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&>(void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&) /usr/include/c++/12/bits/vector.tcc:123 (pivxd+0x432641)
    #6 StartHTTPServer() /home/ale/PIVX/src/httpserver.cpp:439 (pivxd+0x42d4e2)
    #7 AppInitServers() /home/ale/PIVX/src/init.cpp:778 (pivxd+0x6d3cf)
    #8 AppInitMain() /home/ale/PIVX/src/init.cpp:1254 (pivxd+0x79539)
    #9 AppInit(int, char**) /home/ale/PIVX/src/pivxd.cpp:144 (pivxd+0x69d11)
    #10 main /home/ale/PIVX/src/pivxd.cpp:172 (pivxd+0x6a087)

  Thread T35 'b-pivx-msghand' (tid=12984, running) created by main thread at:
    #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1001 (libtsan.so.2+0x5e686)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xd4578)
    #2 CConnman::Start(CScheduler&, CConnman::Options const&) /home/ale/PIVX/src/net.cpp:2297 (pivxd+0x104b47)
    #3 AppInitMain() /home/ale/PIVX/src/init.cpp:1827 (pivxd+0x7d3c4)
    #4 AppInit(int, char**) /home/ale/PIVX/src/pivxd.cpp:144 (pivxd+0x69d11)
    #5 main /home/ale/PIVX/src/pivxd.cpp:172 (pivxd+0x6a087)

  Thread T21 'b-bitcoin-httpw' (tid=12899, running) created by main thread at:
    #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1001 (libtsan.so.2+0x5e686)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xd4578)
    #2 void std::__new_allocator<std::thread>::construct<std::thread, void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&>(std::thread*, void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&) /usr/include/c++/12/bits/new_allocator.h:175 (pivxd+0x4325f0)
    #3 void std::allocator_traits<std::allocator<std::thread> >::construct<std::thread, void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&>(std::allocator<std::thread>&, std::thread*, void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&) /usr/include/c++/12/bits/alloc_traits.h:516 (pivxd+0x4325f0)
    #4 void std::vector<std::thread, std::allocator<std::thread> >::emplace_back<void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&>(void (&)(WorkQueue<HTTPClosure>*), WorkQueue<HTTPClosure>*&) /usr/include/c++/12/bits/vector.tcc:117 (pivxd+0x4325f0)
    #5 StartHTTPServer() /home/ale/PIVX/src/httpserver.cpp:439 (pivxd+0x42d4e2)
    #6 AppInitServers() /home/ale/PIVX/src/init.cpp:778 (pivxd+0x6d3cf)
    #7 AppInitMain() /home/ale/PIVX/src/init.cpp:1254 (pivxd+0x79539)
    #8 AppInit(int, char**) /home/ale/PIVX/src/pivxd.cpp:144 (pivxd+0x69d11)
    #9 main /home/ale/PIVX/src/pivxd.cpp:172 (pivxd+0x6a087)

@panleone panleone self-assigned this Apr 8, 2024
@panleone panleone added this to the 6.0.0 milestone Apr 8, 2024
@panleone panleone added the Bug label Apr 8, 2024
Copy link
Member

@Liquid369 Liquid369 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tACK f5ba264

Overall a very nice refactor removing those circular depends gg good improvement

Copy link
Collaborator

@Fuzzbawls Fuzzbawls left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK f5ba264

@Fuzzbawls Fuzzbawls merged commit 22a2fb8 into PIVX-Project:master Apr 25, 2024
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants