41 const void *ptr1 =
nullptr;
43 if(
m_vec[
hash].compare_exchange_strong(ptr1,
INVALID, std::memory_order_relaxed, std::memory_order_relaxed)){
52 wait.emplace_back(
hash);
64 for (
size_t i=0;
i<
s ;
i++) {
65 const void*
ptr =
m_vec[
i].load(std::memory_order_relaxed);
66 m_vec[
i].store(
nullptr, std::memory_order_relaxed);
73 for (
size_t i=0;
i<
s ;
i++)
m_vec[
i].
store(
nullptr, std::memory_order_relaxed);
81 std::atomic_thread_fence(std::memory_order_acquire);
84 for (
size_t i=0;
i<
s ;
i++) {
85 const void*
p =
m_vec[
i].load(std::memory_order_relaxed);
92 const void*
p =
m_vec[
hash].load(std::memory_order_relaxed);
98 const void*
p =
m_vec[
hash].load(std::memory_order_relaxed);
106 const void*
p = m_vec[
hash].load(std::memory_order_acquire);
114 std::atomic<const void*> &myatomic =
m_vec[
hash];
115 const void*
item = myatomic.load(std::memory_order_acquire);
118 myatomic.wait(
item, std::memory_order_relaxed);
119 item = myatomic.load(std::memory_order_acquire);
140 const void*
ptr =
nullptr;
193 std::vector<IdentifierHash> ret;
196 for (
size_t i =0;
i<
s;
i++) {
197 const void*
p =
m_vec[
i].load(std::memory_order_relaxed);
207 if (
ATH_UNLIKELY(
hash >= m_vec.size()))
return std::make_pair(
false,
nullptr);
208 if(
p==
nullptr)
return std::make_pair(
false,
nullptr);
209 const void* nul=
nullptr;
210 if(m_vec[
hash].compare_exchange_strong(nul,
p, std::memory_order_release, std::memory_order_relaxed)){
211 m_currentHashes.fetch_add(1, std::memory_order_relaxed);
212 return std::make_pair(
true,
p);
215 if(m_vec[
hash].compare_exchange_strong(invalid,
p, std::memory_order_release, std::memory_order_acquire)){
216 m_currentHashes.fetch_add(1, std::memory_order_relaxed);
218 return std::make_pair(
true,
p);
220 return std::make_pair(
false, invalid);
227 assert(
hash < m_vec.size());
228 if(
p==
nullptr)
return std::make_pair(
false,
nullptr);
230 if(m_vec[
hash].compare_exchange_strong(invalid,
p, std::memory_order_release, std::memory_order_relaxed)){
231 m_currentHashes.fetch_add(1, std::memory_order_relaxed);
233 return std::make_pair(
true,
p);
235 const void* nul=
nullptr;
236 if(m_vec[
hash].compare_exchange_strong(nul,
p, std::memory_order_release, std::memory_order_acquire)){
237 m_currentHashes.fetch_add(1, std::memory_order_relaxed);
238 return std::make_pair(
true,
p);
240 return std::make_pair(
false, nul);
246 std::pair<bool, const void*>
b = addLock(
hash,
p.get());
247 if(
b.first)
p.release();
255 std::pair<bool, const void*>
b =
add(
hash,
p.get());
256 if(
b.first)
p.release();