aboutsummaryrefslogtreecommitdiffstats
path: root/alc/context.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alc/context.cpp')
-rw-r--r--alc/context.cpp29
1 files changed, 19 insertions, 10 deletions
diff --git a/alc/context.cpp b/alc/context.cpp
index a97c2a68..297d24a6 100644
--- a/alc/context.cpp
+++ b/alc/context.cpp
@@ -133,16 +133,6 @@ ContextBase::~ContextBase()
delete curarray;
}
- count = 0;
- VoicePropsItem *vprops{mFreeVoiceProps.exchange(nullptr, std::memory_order_acquire)};
- while(vprops)
- {
- std::unique_ptr<VoicePropsItem> old{vprops};
- vprops = old->next.load(std::memory_order_relaxed);
- ++count;
- }
- TRACE("Freed %zu voice property object%s\n", count, (count==1)?"":"s");
-
delete mVoices.exchange(nullptr, std::memory_order_relaxed);
count = 0;
@@ -198,6 +188,25 @@ void ContextBase::allocVoiceChanges(size_t addcount)
}
}
+void ContextBase::allocVoiceProps()
+{
+ constexpr size_t clustersize{32};
+
+ TRACE("Increasing allocated voice properties to %zu\n",
+ (mVoicePropClusters.size()+1) * clustersize);
+
+ VoicePropsCluster cluster{std::make_unique<VoicePropsItem[]>(clustersize)};
+ for(size_t i{1};i < clustersize;++i)
+ cluster[i-1].next.store(std::addressof(cluster[i]), std::memory_order_relaxed);
+ mVoicePropClusters.emplace_back(std::move(cluster));
+
+ VoicePropsItem *oldhead{mFreeVoiceProps.load(std::memory_order_acquire)};
+ do {
+ mVoicePropClusters.back()[clustersize-1].next.store(oldhead, std::memory_order_relaxed);
+ } while(mFreeVoiceProps.compare_exchange_weak(oldhead, mVoicePropClusters.back().get(),
+ std::memory_order_acq_rel, std::memory_order_acquire) == false);
+}
+
void ContextBase::allocVoices(size_t addcount)
{
constexpr size_t clustersize{32};