aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2018-11-25 08:42:43 -0800
committerChris Robinson <[email protected]>2018-11-25 08:42:43 -0800
commitbf4518fe5cbe708b3d6b44855f05b58008a48cc8 (patch)
tree60482d67644528cdbfcdb6d31691be1947362dc4
parent7c0605f09eabb55cd3f1b85474b31bfae584cde9 (diff)
Atuomatically clean up sources with its sublist's destruction
-rw-r--r--Alc/alc.cpp10
-rw-r--r--Alc/alcontext.h10
-rw-r--r--OpenAL32/Include/alSource.h2
-rw-r--r--OpenAL32/alSource.cpp29
4 files changed, 25 insertions, 26 deletions
diff --git a/Alc/alc.cpp b/Alc/alc.cpp
index ec7af970..9919d011 100644
--- a/Alc/alc.cpp
+++ b/Alc/alc.cpp
@@ -2598,11 +2598,11 @@ ALCcontext_struct::~ALCcontext_struct()
al_free(ActiveAuxSlots.exchange(nullptr, std::memory_order_relaxed));
DefaultSlot = nullptr;
- ReleaseALSources(this);
- std::for_each(SourceList.begin(), SourceList.end(),
- [](const SourceSubList &entry) noexcept -> void
- { al_free(entry.Sources); }
- );
+ count = 0;
+ for(auto &sublist : SourceList)
+ count += POPCNT64(~sublist.FreeMask);
+ if(count > 0)
+ WARN(SZFMT " Source%s not deleted\n", count, (count==1)?"":"s");
SourceList.clear();
NumSources = 0;
almtx_destroy(&SourceLock);
diff --git a/Alc/alcontext.h b/Alc/alcontext.h
index b1bbd1af..c6824d78 100644
--- a/Alc/alcontext.h
+++ b/Alc/alcontext.h
@@ -44,6 +44,16 @@ enum class DistanceModel {
struct SourceSubList {
uint64_t FreeMask{~uint64_t{}};
ALsource *Sources{nullptr}; /* 64 */
+
+ SourceSubList() noexcept = default;
+ SourceSubList(const SourceSubList&) = delete;
+ SourceSubList(SourceSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Sources{rhs.Sources}
+ { rhs.FreeMask = ~uint64_t{}; rhs.Sources = nullptr; }
+ ~SourceSubList();
+
+ SourceSubList& operator=(const SourceSubList&) = delete;
+ SourceSubList& operator=(SourceSubList&& rhs) noexcept
+ { std::swap(FreeMask, rhs.FreeMask); std::swap(Sources, rhs.Sources); return *this; }
};
/* Effect slots are rather large, and apps aren't likely to have more than one
diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h
index 4e111250..05ccdadf 100644
--- a/OpenAL32/Include/alSource.h
+++ b/OpenAL32/Include/alSource.h
@@ -119,8 +119,6 @@ typedef struct ALsource {
void UpdateAllSourceProps(ALCcontext *context);
-ALvoid ReleaseALSources(ALCcontext *Context);
-
#ifdef __cplusplus
}
#endif
diff --git a/OpenAL32/alSource.cpp b/OpenAL32/alSource.cpp
index 0955d1e9..8b461982 100644
--- a/OpenAL32/alSource.cpp
+++ b/OpenAL32/alSource.cpp
@@ -3399,28 +3399,19 @@ void UpdateAllSourceProps(ALCcontext *context)
);
}
-/* ReleaseALSources
- *
- * Destroys all sources in the source map.
- */
-ALvoid ReleaseALSources(ALCcontext *context)
+SourceSubList::~SourceSubList()
{
- size_t leftover = 0;
- for(auto &sublist : context->SourceList)
+ ALuint64 usemask = ~FreeMask;
+ while(usemask)
{
- ALuint64 usemask = ~sublist.FreeMask;
- while(usemask)
- {
- ALsizei idx{CTZ64(usemask)};
- ALsource *source{sublist.Sources + idx};
+ ALsizei idx{CTZ64(usemask)};
+ ALsource *source{Sources + idx};
- source->~ALsource();
- ++leftover;
+ source->~ALsource();
- usemask &= ~(U64(1) << idx);
- }
- sublist.FreeMask = ~usemask;
+ usemask &= ~(U64(1) << idx);
}
- if(leftover > 0)
- WARN("(%p) Deleted " SZFMT " Source%s\n", context, leftover, (leftover==1)?"":"s");
+ FreeMask = ~usemask;
+ al_free(Sources);
+ Sources = nullptr;
}