aboutsummaryrefslogtreecommitdiffstats
path: root/alc/context.cpp
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2024-01-01 15:54:30 -0800
committerChris Robinson <[email protected]>2024-01-01 15:54:30 -0800
commit70a8cf88041d88c49dcd258587e6b84960752851 (patch)
tree50acfdf6587a68e985aa713567b2e997cb5eef4f /alc/context.cpp
parent936e654b261b4d1cb604a44da534ba385aa10099 (diff)
Use an atomic unique_ptr for the device's context array
Diffstat (limited to 'alc/context.cpp')
-rw-r--r--alc/context.cpp18
1 files changed, 5 insertions, 13 deletions
diff --git a/alc/context.cpp b/alc/context.cpp
index 0f6dbbae..67f08aee 100644
--- a/alc/context.cpp
+++ b/alc/context.cpp
@@ -263,12 +263,8 @@ void ALCcontext::deinit()
if(auto toremove = static_cast<size_t>(std::count(oldarray->begin(), oldarray->end(), this)))
{
using ContextArray = al::FlexArray<ContextBase*>;
- auto alloc_ctx_array = [](const size_t count) -> ContextArray*
- {
- if(count == 0) return &DeviceBase::sEmptyContextArray;
- return ContextArray::Create(count).release();
- };
- auto *newarray = alloc_ctx_array(oldarray->size() - toremove);
+ const size_t newsize{oldarray->size() - toremove};
+ auto newarray = ContextArray::Create(newsize);
/* Copy the current/old context handles to the new array, excluding the
* given context.
@@ -279,14 +275,10 @@ void ALCcontext::deinit()
/* Store the new context array in the device. Wait for any current mix
* to finish before deleting the old array.
*/
- mDevice->mContexts.store(newarray);
- if(oldarray != &DeviceBase::sEmptyContextArray)
- {
- std::ignore = mDevice->waitForMix();
- delete oldarray;
- }
+ auto prevarray = mDevice->mContexts.exchange(std::move(newarray));
+ std::ignore = mDevice->waitForMix();
- stopPlayback = newarray->empty();
+ stopPlayback = (newsize == 0);
}
else
stopPlayback = oldarray->empty();