diff options
author | Chris Robinson <[email protected]> | 2024-01-01 15:54:30 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2024-01-01 15:54:30 -0800 |
commit | 70a8cf88041d88c49dcd258587e6b84960752851 (patch) | |
tree | 50acfdf6587a68e985aa713567b2e997cb5eef4f /alc/context.cpp | |
parent | 936e654b261b4d1cb604a44da534ba385aa10099 (diff) |
Use an atomic unique_ptr for the device's context array
Diffstat (limited to 'alc/context.cpp')
-rw-r--r-- | alc/context.cpp | 18 |
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(); |