aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-08-20 16:06:15 +0200
committerShauren <shauren.trinity@gmail.com>2020-08-20 16:06:15 +0200
commite1289805fc04e75f9e7cba078cbc826ce60f037a (patch)
treee85177d6bbc1477d9f561a46e6a44d62197b54eb /src
parent89fd7d45923671a5f27ab31a43e26b7c553a8957 (diff)
Core/Networking: Initialize MPSCQueueIntrusive dummy node without undefined behavior
Diffstat (limited to 'src')
-rw-r--r--src/common/Threading/MPSCQueue.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/common/Threading/MPSCQueue.h b/src/common/Threading/MPSCQueue.h
index ac245e1b332..5f71b9dac42 100644
--- a/src/common/Threading/MPSCQueue.h
+++ b/src/common/Threading/MPSCQueue.h
@@ -95,10 +95,10 @@ class MPSCQueueIntrusive
public:
MPSCQueueIntrusive() : _dummyPtr(reinterpret_cast<T*>(std::addressof(_dummy))), _head(_dummyPtr), _tail(_dummyPtr)
{
- T* front = _head.load(std::memory_order_relaxed);
- (front->*IntrusiveLink).store(nullptr, std::memory_order_relaxed);
- // _dummy is constructed from aligned_storage and is left uninitialized so we init only its Next here
- (_dummyPtr->*IntrusiveLink).store(nullptr, std::memory_order_relaxed);
+ // _dummy is constructed from aligned_storage and is intentionally left uninitialized (it might not be default constructible)
+ // so we init only its IntrusiveLink here
+ std::atomic<T*>* dummyNext = new (&(_dummyPtr->*IntrusiveLink)) std::atomic<T*>();
+ dummyNext->store(nullptr, std::memory_order_relaxed);
}
~MPSCQueueIntrusive()