diff options
author | Chris Robinson <chris.kcat@gmail.com> | 2023-05-24 11:56:56 -0700 |
---|---|---|
committer | Chris Robinson <chris.kcat@gmail.com> | 2023-05-24 11:56:56 -0700 |
commit | f3e9d066df50a6e77e8c15ea97b195a4b069f254 (patch) | |
tree | 1823b869dd881b1c46243ba3e653979d210caba6 /core | |
parent | da56dd074595d6590273eeb1739f1c9bfc1b5fee (diff) |
Be a bit more safe with type mangling
Diffstat (limited to 'core')
-rw-r--r-- | core/async_event.h | 8 | ||||
-rw-r--r-- | core/context.cpp | 6 | ||||
-rw-r--r-- | core/voice.cpp | 6 |
3 files changed, 12 insertions, 8 deletions
diff --git a/core/async_event.h b/core/async_event.h index 9e2d1193..c049fa02 100644 --- a/core/async_event.h +++ b/core/async_event.h @@ -54,7 +54,11 @@ using AsyncEvent = std::variant<AsyncKillThread, AsyncDisconnectEvent>; template<typename T, typename ...Args> -auto &InitAsyncEvent(AsyncEvent *evt, Args&& ...args) -{ return std::get<T>(*al::construct_at(evt, std::in_place_type<T>, std::forward<Args>(args)...)); } +auto &InitAsyncEvent(std::byte *evtbuf, Args&& ...args) +{ + auto *evt = al::construct_at(reinterpret_cast<AsyncEvent*>(evtbuf), std::in_place_type<T>, + std::forward<Args>(args)...); + return std::get<T>(*evt); +} #endif diff --git a/core/context.cpp b/core/context.cpp index 145ce349..2ebbc7b1 100644 --- a/core/context.cpp +++ b/core/context.cpp @@ -66,12 +66,14 @@ ContextBase::~ContextBase() auto evt_vec = mAsyncEvents->getReadVector(); if(evt_vec.first.len > 0) { - std::destroy_n(reinterpret_cast<AsyncEvent*>(evt_vec.first.buf), evt_vec.first.len); + std::destroy_n(std::launder(reinterpret_cast<AsyncEvent*>(evt_vec.first.buf)), + evt_vec.first.len); count += evt_vec.first.len; } if(evt_vec.second.len > 0) { - std::destroy_n(reinterpret_cast<AsyncEvent*>(evt_vec.second.buf), evt_vec.second.len); + std::destroy_n(std::launder(reinterpret_cast<AsyncEvent*>(evt_vec.second.buf)), + evt_vec.second.len); count += evt_vec.second.len; } if(count > 0) diff --git a/core/voice.cpp b/core/voice.cpp index 3e78b176..65986cd1 100644 --- a/core/voice.cpp +++ b/core/voice.cpp @@ -226,8 +226,7 @@ void SendSourceStoppedEvent(ContextBase *context, uint id) auto evt_vec = ring->getWriteVector(); if(evt_vec.first.len < 1) return; - AsyncSourceStateEvent &evt = InitAsyncEvent<AsyncSourceStateEvent>( - reinterpret_cast<AsyncEvent*>(evt_vec.first.buf)); + auto &evt = InitAsyncEvent<AsyncSourceStateEvent>(evt_vec.first.buf); evt.mId = id; evt.mState = AsyncSrcState::Stop; @@ -1151,8 +1150,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const nanoseconds devi auto evt_vec = ring->getWriteVector(); if(evt_vec.first.len > 0) { - AsyncBufferCompleteEvent &evt = InitAsyncEvent<AsyncBufferCompleteEvent>( - reinterpret_cast<AsyncEvent*>(evt_vec.first.buf)); + auto &evt = InitAsyncEvent<AsyncBufferCompleteEvent>(evt_vec.first.buf); evt.mId = SourceID; evt.mCount = buffers_done; ring->writeAdvance(1); |