From 71fb7636c5afb6bcf1ea384f264b89abf824e681 Mon Sep 17 00:00:00 2001 From: joaquintides Date: Wed, 20 Dec 2023 19:02:49 +0100 Subject: [PATCH] prevented gc overcall, temporarily disabled gc --- .../unordered/detail/foa/concurrent_table.hpp | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/include/boost/unordered/detail/foa/concurrent_table.hpp b/include/boost/unordered/detail/foa/concurrent_table.hpp index f0a4852d..3b00d530 100644 --- a/include/boost/unordered/detail/foa/concurrent_table.hpp +++ b/include/boost/unordered/detail/foa/concurrent_table.hpp @@ -512,7 +512,8 @@ public: retired_element_allocator_type ral=this->al(); for(std::size_t i=0;i(pg)+n; auto mco=group_type::maybe_caused_overflow(pc); if(reinterpret_cast*>(pc)->exchange(1)!=1){ +#if 1 + auto& v=local_garbage_vector(); + --v.size; + v.mcos+=mco; + pg->reset(n); +#else retire_element(p,mco); +#endif res=1; } } @@ -1949,7 +1957,7 @@ private: std::atomic rpos=0; std::atomic reading=false; std::atomic size=0; - std::atomic mcos=0; + std::atomic mcos=0; }; static constexpr std::size_t default_max_probe=3; @@ -1975,10 +1983,10 @@ private: BOOST_FORCEINLINE void retire_element(element_type* p,bool mco) { - auto& v=local_garbage_vector(); - std::size_t wpos=v.wpos; - std::size_t expected=retired_element::available_; + auto& v=local_garbage_vector(); for(;;){ + std::size_t wpos=v.wpos; + std::size_t expected=retired_element::available_; auto& e=v.retired_elements[wpos%v.garbage_vector::N]; if(e.epoch.compare_exchange_strong(expected,retired_element::reserved_)){ e.p=p; @@ -2000,8 +2008,6 @@ private: v.epoch=++current_epoch; garbage_collect(); } - wpos=v.wpos; - expected=retired_element::available_; } } @@ -2015,12 +2021,12 @@ private: v.size=0; v.mcos=0; } - //std::cout<<"("<size_ctrl.size<<","<size_ctrl.ml<<")"; } void garbage_collect(garbage_vector& v,std::size_t max_epoch) { if(v.rpos==v.wpos)return; + v.epoch_bump=0; bool expected=false; if(v.reading.compare_exchange_strong(expected,true)){