mirror of
https://github.com/boostorg/unordered.git
synced 2025-07-30 11:27:15 +02:00
optimized non-visiting insertion
This commit is contained in:
@ -1402,7 +1402,7 @@ private:
|
|||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
BOOST_FORCEINLINE bool construct_and_emplace(Args&&... args)
|
BOOST_FORCEINLINE bool construct_and_emplace(Args&&... args)
|
||||||
{
|
{
|
||||||
#if defined(BOOST_UNORDERED_LATCH_FREE)
|
#if 0 && defined(BOOST_UNORDERED_LATCH_FREE)
|
||||||
return construct_and_emplace_or_visit(
|
return construct_and_emplace_or_visit(
|
||||||
group_synchronized_shared{},[](const value_type&){},std::forward<Args>(args)...);
|
group_synchronized_shared{},[](const value_type&){},std::forward<Args>(args)...);
|
||||||
#else
|
#else
|
||||||
@ -1457,7 +1457,7 @@ private:
|
|||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
BOOST_FORCEINLINE bool emplace_impl(Args&&... args)
|
BOOST_FORCEINLINE bool emplace_impl(Args&&... args)
|
||||||
{
|
{
|
||||||
#if defined(BOOST_UNORDERED_LATCH_FREE)
|
#if 0 && defined(BOOST_UNORDERED_LATCH_FREE)
|
||||||
return emplace_or_visit_impl(
|
return emplace_or_visit_impl(
|
||||||
group_synchronized_shared{},
|
group_synchronized_shared{},
|
||||||
[](const value_type&){},std::forward<Args>(args)...);
|
[](const value_type&){},std::forward<Args>(args)...);
|
||||||
@ -1584,7 +1584,11 @@ private:
|
|||||||
|
|
||||||
for(;;){
|
for(;;){
|
||||||
startover:
|
startover:
|
||||||
boost::uint32_t counter=insert_counter(pos0);
|
boost::uint32_t counter=0;
|
||||||
|
{
|
||||||
|
auto lck=access(group_exclusive{},pos0);
|
||||||
|
counter=insert_counter(pos0);
|
||||||
|
}
|
||||||
if(unprotected_visit(
|
if(unprotected_visit(
|
||||||
access_mode,k,pos0,hash,std::forward<F>(f)))return 0;
|
access_mode,k,pos0,hash,std::forward<F>(f)))return 0;
|
||||||
|
|
||||||
@ -1602,15 +1606,14 @@ private:
|
|||||||
/* slot wasn't empty */
|
/* slot wasn't empty */
|
||||||
goto startover;
|
goto startover;
|
||||||
}
|
}
|
||||||
auto lck=access(group_exclusive{},pos);
|
auto lck=access(group_exclusive{},pos0);
|
||||||
auto p=this->arrays.elements()+pos*N+n;
|
|
||||||
this->construct_element(p,std::forward<Args>(args)...);
|
|
||||||
if(BOOST_UNLIKELY(insert_counter(pos0)++!=counter)){
|
if(BOOST_UNLIKELY(insert_counter(pos0)++!=counter)){
|
||||||
/* other thread inserted from pos0, need to start over */
|
/* other thread inserted from pos0, need to start over */
|
||||||
this->destroy_element(p);
|
|
||||||
pg->reset(n);
|
pg->reset(n);
|
||||||
goto startover;
|
goto startover;
|
||||||
}
|
}
|
||||||
|
auto p=this->arrays.elements()+pos*N+n;
|
||||||
|
this->construct_element(p,std::forward<Args>(args)...);
|
||||||
pg->set(n,hash);
|
pg->set(n,hash);
|
||||||
rsize.commit();
|
rsize.commit();
|
||||||
return 1;
|
return 1;
|
||||||
|
Reference in New Issue
Block a user