From 926b032de2c8654796787fea112d9a4ef9e09c43 Mon Sep 17 00:00:00 2001 From: Billy O'Neal Date: Tue, 28 Jan 2020 14:05:38 -0800 Subject: [PATCH] Avoid std::atomic_init deprecated by P0883. (#140) Resolves #139 --- include/cppcoro/multi_producer_sequencer.hpp | 4 ++++ lib/cancellation_state.cpp | 21 ++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/include/cppcoro/multi_producer_sequencer.hpp b/include/cppcoro/multi_producer_sequencer.hpp index e13bfe6..72589c3 100644 --- a/include/cppcoro/multi_producer_sequencer.hpp +++ b/include/cppcoro/multi_producer_sequencer.hpp @@ -511,7 +511,11 @@ namespace cppcoro SEQUENCE seq = initialSequence - (bufferSize - 1); do { +#ifdef __cpp_lib_atomic_value_initialization + m_published[seq & m_sequenceMask].store(seq, std::memory_order_relaxed); +#else // ^^^ __cpp_lib_atomic_value_initialization // !__cpp_lib_atomic_value_initialization vvv std::atomic_init(&m_published[seq & m_sequenceMask], seq); +#endif // !__cpp_lib_atomic_value_initialization } while (seq++ != initialSequence); } diff --git a/lib/cancellation_state.cpp b/lib/cancellation_state.cpp index e4118f8..a81123c 100644 --- a/lib/cancellation_state.cpp +++ b/lib/cancellation_state.cpp @@ -79,13 +79,13 @@ cppcoro::detail::cancellation_registration_list_chunk::allocate(std::uint32_t en throw std::bad_alloc{}; } - std::atomic_init(&chunk->m_nextChunk, static_cast(nullptr)); + ::new (&chunk->m_nextChunk) std::atomic(nullptr); chunk->m_prevChunk = nullptr; - std::atomic_init(&chunk->m_approximateFreeCount, static_cast(entryCount - 1)); + ::new (&chunk->m_approximateFreeCount) std::atomic(static_cast(entryCount - 1)); chunk->m_entryCount = entryCount; for (std::uint32_t i = 0; i < entryCount; ++i) { - std::atomic_init(&chunk->m_entries[i], static_cast(nullptr)); + ::new (&chunk->m_entries[i]) std::atomic(nullptr); } return chunk; @@ -112,14 +112,15 @@ cppcoro::detail::cancellation_registration_list::allocate() throw std::bad_alloc{}; } - std::atomic_init(&bucket->m_approximateTail, &bucket->m_headChunk); - std::atomic_init(&bucket->m_headChunk.m_nextChunk, static_cast(nullptr)); + ::new (&bucket->m_approximateTail) std::atomic(&bucket->m_headChunk); + ::new (&bucket->m_headChunk.m_nextChunk) std::atomic(nullptr); bucket->m_headChunk.m_prevChunk = nullptr; - std::atomic_init(&bucket->m_headChunk.m_approximateFreeCount, static_cast(initialChunkSize - 1)); + ::new (&bucket->m_headChunk.m_approximateFreeCount) + std::atomic(static_cast(initialChunkSize - 1)); bucket->m_headChunk.m_entryCount = initialChunkSize; for (std::uint32_t i = 0; i < initialChunkSize; ++i) { - std::atomic_init(&bucket->m_headChunk.m_entries[i], static_cast(nullptr)); + ::new (&bucket->m_headChunk.m_entries[i]) std::atomic(nullptr); } return bucket; @@ -158,7 +159,7 @@ cppcoro::detail::cancellation_registration_state::allocate() state->m_listCount = listCount; for (std::uint32_t i = 0; i < listCount; ++i) { - std::atomic_init(&state->m_lists[i], static_cast(nullptr)); + ::new (&state->m_lists[i]) std::atomic(nullptr); } return state; @@ -187,7 +188,7 @@ cppcoro::detail::cancellation_registration_state::add_registration( // Pre-claim the first slot. registration->m_chunk = &newList->m_headChunk; registration->m_entryIndex = 0; - std::atomic_init(&newList->m_headChunk.m_entries[0], registration); + ::new (&newList->m_headChunk.m_entries[0]) std::atomic(registration); if (listPtr.compare_exchange_strong( list, @@ -305,7 +306,7 @@ cppcoro::detail::cancellation_registration_state::add_registration( // Pre-allocate first slot. registration->m_chunk = newChunk; registration->m_entryIndex = 0; - std::atomic_init(&newChunk->m_entries[0], registration); + ::new (&newChunk->m_entries[0]) std::atomic(registration); cancellation_registration_list_chunk* oldNext = nullptr; if (lastChunk->m_nextChunk.compare_exchange_strong(