removed node recycling

This commit is contained in:
joaquintides
2024-02-02 19:09:39 +01:00
parent 1e9970d150
commit 1c48ce8194

View File

@ -572,7 +572,7 @@ public:
} }
std::cout std::cout
<<"version: 2024/02/03 11:30; " <<"version: 2024/02/03 19:10; "
<<"lf: "<<(double)size()/capacity()<<"; " <<"lf: "<<(double)size()/capacity()<<"; "
<<"capacity: "<<capacity()<<"; " <<"capacity: "<<capacity()<<"; "
<<"rehashes: "<<rehashes<<"; " <<"rehashes: "<<rehashes<<"; "
@ -2022,7 +2022,7 @@ private:
retired_element* retired_elements; retired_element* retired_elements;
std::atomic<std::size_t> wpos=0; std::atomic<std::size_t> wpos=0;
std::atomic<std::size_t> rpos=0; std::atomic<std::size_t> rpos=0;
std::atomic<std::size_t> apos=0; //std::atomic<std::size_t> apos=0;
std::atomic<ssize_t> size=0; std::atomic<ssize_t> size=0;
std::atomic<ssize_t> mcos=0; std::atomic<ssize_t> mcos=0;
}; };
@ -2074,13 +2074,14 @@ private:
std::size_t expected=retired_element::available_; std::size_t expected=retired_element::available_;
auto& e=v.retired_elements[wpos%v.garbage_vector::N]; auto& e=v.retired_elements[wpos%v.garbage_vector::N];
if(e.epoch.compare_exchange_strong(expected,retired_element::reserved_)){ if(e.epoch.compare_exchange_strong(expected,retired_element::reserved_)){
p=e.p.exchange(p); e.p=p;
if(p){ //p=e.p.exchange(p);
++nodes_wasted; //if(p){
element_type x{p}; // ++nodes_wasted;
this->destroy_element(&x); // element_type x{p};
++v.apos; // this->destroy_element(&x);
} // ++v.apos;
//}
e.epoch=v.epoch.load(); e.epoch=v.epoch.load();
if(++v.wpos%garbage_vector::min_for_garbage_collection==0){ if(++v.wpos%garbage_vector::min_for_garbage_collection==0){
garbage_collect(v,max_safe_epoch()); garbage_collect(v,max_safe_epoch());
@ -2098,16 +2099,16 @@ private:
BOOST_FORCEINLINE value_type* new_element() BOOST_FORCEINLINE value_type* new_element()
{ {
auto& v=local_garbage_vector(); //auto& v=local_garbage_vector();
for(;;){ //for(;;){
std::size_t apos=v.apos; // std::size_t apos=v.apos;
if(apos>=v.rpos)break; /*`no available elements*/ // if(apos>=v.rpos)break; /*`no available elements*/
auto pv=v.retired_elements[apos%v.garbage_vector::N].p.load(); // auto pv=v.retired_elements[apos%v.garbage_vector::N].p.load();
if(v.apos.compare_exchange_weak(apos,apos+1)){ // if(v.apos.compare_exchange_weak(apos,apos+1)){
v.retired_elements[apos%v.garbage_vector::N].p=nullptr; // v.retired_elements[apos%v.garbage_vector::N].p=nullptr;
return pv; // return pv;
} // }
} //}
/* allocate */ /* allocate */
return boost::allocator_allocate(this->al(),1); return boost::allocator_allocate(this->al(),1);
@ -2158,6 +2159,8 @@ private:
for(;;){ for(;;){
auto& e=v.retired_elements[rpos%v.garbage_vector::N]; auto& e=v.retired_elements[rpos%v.garbage_vector::N];
if(e.epoch>max_epoch)break; if(e.epoch>max_epoch)break;
element_type x{e.p};
this->destroy_element(&x);
e.epoch=retired_element::available_; e.epoch=retired_element::available_;
++rpos; ++rpos;
} }