diff options
author | Chris Robinson <[email protected]> | 2024-01-01 05:11:53 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2024-01-01 05:53:12 -0800 |
commit | 45fca6a301a6d424bd0d856d0ae29ce56c5dc9ac (patch) | |
tree | 483daf3d82c03da685650840261cddded6c493cb /al/filter.cpp | |
parent | 2f2edb326128c56e269a171961d991d8d7936e4f (diff) |
Use an allocator to allocate uninitilized sublists
Diffstat (limited to 'al/filter.cpp')
-rw-r--r-- | al/filter.cpp | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/al/filter.cpp b/al/filter.cpp index b67a65f7..528d6059 100644 --- a/al/filter.cpp +++ b/al/filter.cpp @@ -49,6 +49,8 @@ namespace { +using SubListAllocator = typename al::allocator<std::array<ALfilter,64>>; + class filter_exception final : public al::base_exception { ALenum mErrorCode; @@ -121,22 +123,21 @@ bool EnsureFilters(ALCdevice *device, size_t needed) [](size_t cur, const FilterSubList &sublist) noexcept -> size_t { return cur + static_cast<ALuint>(al::popcount(sublist.FreeMask)); })}; - while(needed > count) - { - if(device->FilterList.size() >= 1<<25) UNLIKELY - return false; - - device->FilterList.emplace_back(); - auto sublist = device->FilterList.end() - 1; - sublist->FreeMask = ~0_u64; - sublist->Filters = static_cast<gsl::owner<std::array<ALfilter,64>*>>(al_calloc( - alignof(ALfilter), sizeof(*sublist->Filters))); - if(!sublist->Filters) UNLIKELY + try { + while(needed > count) { - device->FilterList.pop_back(); - return false; + if(device->FilterList.size() >= 1<<25) UNLIKELY + return false; + + FilterSubList sublist{}; + sublist.FreeMask = ~0_u64; + sublist.Filters = SubListAllocator{}.allocate(1); + device->FilterList.emplace_back(std::move(sublist)); + count += 64; } - count += 64; + } + catch(...) { + return false; } return true; } @@ -700,6 +701,6 @@ FilterSubList::~FilterSubList() usemask &= ~(1_u64 << idx); } FreeMask = ~usemask; - al_free(alignof(ALfilter), Filters); + SubListAllocator{}.deallocate(Filters, 1); Filters = nullptr; } |