aboutsummaryrefslogtreecommitdiffstats
path: root/al/filter.cpp
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2024-01-01 05:11:53 -0800
committerChris Robinson <[email protected]>2024-01-01 05:53:12 -0800
commit45fca6a301a6d424bd0d856d0ae29ce56c5dc9ac (patch)
tree483daf3d82c03da685650840261cddded6c493cb /al/filter.cpp
parent2f2edb326128c56e269a171961d991d8d7936e4f (diff)
Use an allocator to allocate uninitilized sublists
Diffstat (limited to 'al/filter.cpp')
-rw-r--r--al/filter.cpp31
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;
}